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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 1185 炮兵阵地 状压dp

發布時間:2025/3/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1185 炮兵阵地 状压dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://poj.org/problem?id=1185

經典題目不必多說,直接貼代碼。

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int n, m, cnt, size; 7 int a[110], st[70], ct[70]; 8 char str[15]; 9 int f[110][70][70]; 10 void init() 11 { 12 size = 0; 13 int maxn = 1 << m; 14 for (int i = 0; i < maxn; i++){ 15 if (!(i&(i<<2)) && !(i&(i<<1))){ 16 st[size] = i; 17 ct[size] = 0; 18 int tmp = i; 19 while(tmp) tmp = tmp&(tmp-1), ct[size]++; 20 size++; 21 } 22 } 23 } 24 int main() 25 { 26 scanf("%d %d", &n, &m); 27 for (int i = 1; i <= n; i++){ 28 scanf("%s", str); 29 a[i] = 0; 30 for (int j = 0; j < m; j++){ 31 if (str[j] == 'H') a[i] |= 1 << j; 32 } 33 } 34 init(); 35 memset(f, 0, sizeof(f)); 36 for (int j = 0; j < size; j++){ 37 if (!(a[1]&st[j])) f[1][j][0] = ct[j]; 38 } 39 for (int i = 2; i <= n; i++){ 40 for (int j = 0; j < size; j++){ 41 if (a[i]&st[j]) continue; 42 for (int k = 0; k < size; k++){ 43 if (a[i-1]&st[k]) continue; 44 if (i == 2){ 45 if (!(st[j]&st[k])) 46 f[i][j][k] = max(f[i][j][k], f[i-1][k][0] + ct[j]); 47 } 48 else for (int l = 0; l < size; l++){ 49 if (!(a[i-2]&st[l]) && !(st[j]&st[k]) && !(st[j]&st[l]) && !(st[k]&st[l])) 50 f[i][j][k] = max(f[i][j][k], f[i-1][k][l] + ct[j]); 51 } 52 } 53 } 54 } 55 int ans = 0; 56 for (int j = 0; j < size; j++) 57 for (int k = 0; k < size; k++) 58 ans = max(ans, f[n][j][k]); 59 printf("%d\n", ans); 60 return 0; 61 }

?

轉載于:https://www.cnblogs.com/james47/p/3900231.html

總結

以上是生活随笔為你收集整理的POJ 1185 炮兵阵地 状压dp的全部內容,希望文章能夠幫你解決所遇到的問題。

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