现在的位置: 首页 > 综合 > 正文

hdu 2167

2019年09月06日 ⁄ 综合 ⁄ 共 1311字 ⁄ 字号 评论关闭
//状态压缩DP
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;

const int N=17, M=1600;
int map[N][N], p[N], val[M][N], dp[N][M], sum[N][M];
vector<int> mat[M];
int n,num,ans;

void Make()
{
    memset(p,0,sizeof(p));
    int i,j,m,tmp,x;
    num=0;
    m=(1<<n)-1;
    for(i=0;i<=m;i++)
    {
        tmp=n; x=i;
        while(x){
            p[tmp--]=x%2;
            x/=2;
        }

        for(j=2;j<=n;j++)
            if(p[j] && p[j-1]) break;
        if(j==n+1)
        {
            for(j=1;j<=n;j++)
                val[num][j]=p[j];
            num++;
        }
    }
}

bool check(int *a, int *b)
{
	for(int i=1;i<=n;i++)
		if(a[i] && (b[i-1] || b[i] || b[i+1])) return 0;
	return 1;
}

void init()
{
	int i,j,k;
	memset(sum,0,sizeof(sum));
	for(i=0;i<num;i++)
		for(j=i+1;j<num;j++)
			if( check(val[i], val[j]) )
			{
				mat[i].push_back(j);
				mat[j].push_back(i);
			}
	for(i=1;i<=n;i++)
		for(j=0;j<num;j++)
			for(k=1;k<=n;k++) sum[i][j]+=val[j][k]*map[i][k];
}

void solve()
{
	int i,j,k,cur;
	memset(dp,0,sizeof(dp));
	for(i=1;i<=n;i++)
		for(j=0;j<num;j++)
		{
			int m=mat[j].size();
			for(k=0;k<m;k++)
			{
				cur=mat[j][k];
				dp[i][j]=max(dp[i][j], dp[i-1][cur]+sum[i][j]);
			}
		}
	ans=0;
	for(i=0;i<num;i++) ans=max(ans,dp[n][i]);
}

int main()
{
    // freopen("in","r",stdin);
    // freopen("out","w",stdout);
    char s[100];
    int tmp,i,j,len,m,k=1;

    while(gets(s)!=NULL)
    {
        len=strlen(s);
        n=(len+1)/3;
        for(i=0,j=1;i<len;i+=3)
            map[1][j++]=10*(s[i]-'0')+s[i+1]-'0';

        for(k=2;k<=n;k++){
            gets(s);
            for(i=0,j=1;i<len;i+=3)
                map[k][j++]=10*(s[i]-'0')+s[i+1]-'0';
        }
        getchar();

        Make();
        init();
        solve();
        printf("%d\n",ans);
    }
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.