HDU-4539-郑厂长系列故事——排兵布阵
2013-03-31 11:17
232 查看
这个题是腾讯马拉松的一个题,当时没做出来,今天看了下状态压缩,然后做了下。感觉跟POJ1185很像,基本上只是改一下。
其实主要修改的只有2个地方,因为这个地所要求的是曼哈顿距离为2,所以在转移上一层状态的时候应该判断是否左右相邻。同时上层与上上层之间也同样需要做这样一个判断。
代码:
其实主要修改的只有2个地方,因为这个地所要求的是曼哈顿距离为2,所以在转移上一层状态的时候应该判断是否左右相邻。同时上层与上上层之间也同样需要做这样一个判断。
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=202; int dp[maxn][maxn][maxn],e[maxn],s[maxn],c[maxn]; int n,m,cnt; int Count(int x) { int ans=0; while(x) { if(x&1) ans++; x>>=1; } return ans; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(e,0,sizeof(e)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { int ita; scanf("%d",&ita); if(!ita) e[i]|=(1<<j); } cnt=0; int total=1<<m; for(int i=0;i<total;i++) { if(i&(i<<2)) continue; s[cnt]=i; c[cnt++]=Count(i); } memset(dp,-1,sizeof(dp)); for(int i=0;i<cnt;i++) { if(s[i]&e[0]) continue; dp[0][i][0]=c[i]; } for(int i=1;i<n;i++) { for(int j=0;j<cnt;j++) { if(e[i]&s[j]) continue; for(int k=0;k<cnt;k++) { if((s[j]&(s[k]<<1))||(s[j]&(s[k]>>1))) continue; for(int l=0;l<cnt;l++) { if(s[j]&s[l]) continue; if(s[k]&(s[l]>>1)) continue; if(s[k]&(s[l]<<1)) continue; if(dp[i-1][k][l]==-1) continue; dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+c[j]); } } } } int ans=0; for(int i=0;i<cnt;i++) for(int j=0;j<cnt;j++) ans=max(ans,dp[n-1][i][j]); printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 4539 郑厂长系列故事——排兵布阵 (状压DP)
- hdu 4539 郑厂长系列故事——排兵布阵
- 状态压缩(1) Hdu 4539 郑厂长系列故事——排兵布阵
- hdu 4539 郑厂长系列故事——排兵布阵
- HDU 4539 郑厂长系列故事——排兵布阵 状压dp
- hdu 4539 郑厂长系列故事——排兵布阵 状态压缩+dp;
- hdu-4539-郑厂长系列故事――排兵布阵 状态压缩dp
- HDU 4539 郑厂长系列故事――排兵布阵_状态压缩
- hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)
- HDU-4539 郑厂长系列故事——排兵布阵 状态压缩DP Or 最大团
- HDU 4539 郑厂长系列故事——排兵布阵 (状态压缩DP)
- hdu 4539 郑厂长系列故事——排兵布阵 状态压缩dp
- HDU 4539 郑厂长系列故事——排兵布阵【状压dp】
- hdu 4539 郑厂长系列故事——排兵布阵
- 【DP】 HDU 4539 郑厂长系列故事——排兵布阵 状压
- [2013腾讯马拉松复赛第二场] HDU 4539 郑厂长系列故事——排兵布阵
- 【DP】 HDU 4539 郑厂长系列故事——排兵布阵 状压
- hdu 4539 郑厂长系列故事——排兵布阵 插头dp
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩)
- hdu 4539 郑厂长系列故事——排兵布阵