日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu2167 方格取数 状态压缩dp

發布時間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu2167 方格取数 状态压缩dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:
???? 方格取數,八個方向的限制。
思路:
???? 八個方向的不能用最大流了,四個的可以,八個的不能抽象成二分圖,所以目測只能
用dp來跑,dp[i][j]表示的是第i行j狀態的最優,具體看代碼。

?

?

?

?

?

#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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。