hdu2167 方格取数 状态压缩dp
題意:
???? 方格取數(shù),八個方向的限制。
思路:
???? 八個方向的不能用最大流了,四個的可以,八個的不能抽象成二分圖,所以目測只能用dp來跑,dp[i][j]表示的是第i行j狀態(tài)的最優(yōu),具體看代碼。
?
?
?
?
?
#include<stdio.h>
#include<string.h>
int dp[16][1<<15];
int map[16][16];
int zt[1<<15];
int maxx(int x ,int y)
{
??? return x > y ? x : y;
}
int DP(int n)
{
??? int mk = 0;
??? for(int i = 0 ;i < (1<<n) ;i ++)
??? if((i & (i << 1)) == 0 ) zt[++mk] = i;
???
??? memset(dp ,0 ,sizeof(dp));
??? for(int i = 1 ;i <= n ;i ++)
??? for(int j = 1 ;j <= mk ;j ++)
??? {
??????? int sum = 0;
??????? for(int k = 1 ;k <= n ;k ++)
??????? if(zt[j] & (1 << (k - 1))) sum += map[i][k];
??????? dp[i][j] = sum;
??????? for(int k = 1 ;k <= mk ;k ++)
??????? {
?????????? if(zt[j] & zt[k]) continue;
?????????? if(zt[j] & zt[k]<<1) continue;
?????????? if(zt[j] & zt[k]>>1) continue;
?????????? dp[i][j] = maxx(dp[i][j] ,dp[i-1][k] + sum);
??????? }
???? }
???? int Ans = 0;
???? for(int i = 1 ;i <= mk ;i ++)
???? Ans = maxx(Ans ,dp[n][i]);
???? return Ans;
}
int main ()
{
??? int n ,i ,j ,nowid;
??? while(~scanf("%d" ,&map[1][1]))
??? {
?????? nowid = 1;
?????? while(1)
?????? {
?????????? scanf("%d" ,&map[1][++nowid]);
?????????? if(getchar() == '\n') break;
?????? }
?????? n = nowid;
?????? for(i = 2 ;i <= n ;i ++)
?????? for(j = 1 ;j <= n ;j ++)
?????? scanf("%d" ,&map[i][j]);
?????? printf("%d\n" ,DP(n));
??? }
??? return 0;
}
總結
以上是生活随笔為你收集整理的hdu2167 方格取数 状态压缩dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 5045 费用流
- 下一篇: POJ 3228 二分最大流