方格取數(1) HDU 1565

沒什麼好說的,狀壓dp模板題

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int MAXN=25;
const int dep=18000;
int n;

int map[MAXN][MAXN];
int dp[MAXN][dep];
int p[dep];
int cnt;

void init()
{
	cnt=0;
	for(int i=0;i<(1<<n);i++)
		if(!(i&(i<<1)))
			p[cnt++]=i;
}

int main()
{
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				cin>>map[i][j];
		memset(dp,0,sizeof(dp));
		init();
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<cnt;j++)
			{
				int ans=0;
				for(int k=0;k<n;k++)
					if(p[j]&(1<<k))
						ans+=map[i][k+1];
				for(int k=0;k<cnt;k++)
					if(!(p[k]&p[j]))
						dp[i][j]=max(dp[i][j],dp[i-1][k]+ans);
			}
		}
		int ans=0;
		for(int i=0;i<cnt;i++)
			ans=max(ans,dp[n][i]);
		cout<<ans<<endl;
	}
	return 0;
 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章