HDU2167 Pebbles 题解
来源:互联网 发布:im即时通讯源码 编辑:程序博客网 时间:2024/06/05 21:16
题目大意:在 n * n 每格带权棋盘上取若干互不八相邻格,求最大权值和。
轮廓线动态规划。逐格转移,记状态 f[i, j, k] 为处理至第 (i, j) 格(设 0 ≤ i < n,1 ≤ j ≤ n),前 n 格的取舍状态为 k 的方案数,记 0 为未取,1 为已取,利用二进制状态压缩,则 k 二进制下从低位向高位第 l 位表示当前格前第 l 格是否取的状态,可知 k 最多只需记 n + 1 位即可。对于当前状态 k,转移分为以下四种情况:
当前列为最左列(即 j = 1),此时若格 (i - 1, j) 未取(即 k and
2n−1 = 0),且格 (i - 1, j + 1) 未取(即 k and2n−2 = 0),则可以取格 (i, j),即状态 f[i - 1, n, k] 可以转移到状态 f[i, j, k * 2 and (2n+1−1 ) xor 1]。当前列不为最左列且当前列不为最右列(即 1 < j < n),此时若格 (i - 1, j - 1) 未取(即 k and
2n = 0),且格 (i - 1, j) 未取(即 k and2n−1 = 0),且格 (i - 1, j + 1) 未取(即 k and2n−2 = 0),则可以取当前格 (i, j),即状态 f[i, j - 1, k] 可以转移到状态 f[i, j, k * 2 xor 1]。当前列为最右列(即 j = n),此时若格 (i - 1, j - 1) 未取(即 k and
2n = 0),且格 (i - 1, j) 未取(即 k and2n−1 = 0),则可以取格 (i, j),即状态 f[i, j - 1, k] 可以转移到状态 f[i, j, k * 2 xor 1]。可以不取当前格 (i, j),即状态 f[i, j - 1, k] (或状态 f[i - 1, n - 1, k]) 可以转移到状态 f[i, j, k * 2 and (
2n+1−1 )]。
此题读入较为繁琐,除此之外与 HDU1565 类似。设初始状态 f[-1, n, 0] = 0,f[-1, n, 1 ..
代码如下:
#include<stdio.h>#define max(a,b) ((a)>(b)?(a):(b))int f[2][65540],val[20][20];int main(){ int ans,cur,n; while(scanf("%d",&val[0][n=1])!=EOF) { while(getchar()!='\n') scanf("%d",&val[0][++n]); for(int i=1;i<n;i++) for(int j=1;j<=n;j++) scanf("%d",&val[i][j]); for(int i=0;i<1<<n+1;i++) f[0][i]=f[1][i]=-1; cur=f[0][0]=ans=0; for(int i=0;i<n;i++) for(int j=1;j<=n;j++) { if(j==1) for(int k=0;k<1<<n-2;k++) { if(f[cur][k]>-1&&f[cur^1][k<<1^1]<f[cur][k]+val[i][j]) f[cur^1][k<<1^1]=f[cur][k]+val[i][j]; if(f[cur][k^1<<n]>-1&&f[cur^1][k<<1^1]<f[cur][k^1<<n]+val[i][j]) f[cur^1][k<<1^1]=f[cur][k^1<<n]+val[i][j]; } else for(int k=0;k<1<<n-1-(j<n);k+=2) if(f[cur][k]>-1&&f[cur^1][k<<1^1]<f[cur][k]+val[i][j]) f[cur^1][k<<1^1]=f[cur][k]+val[i][j]; for(int k=0;k<1<<n;k++) f[cur^1][k<<1]=max(f[cur^1][k<<1],f[cur][k]),f[cur][k]=-1, f[cur^1][k<<1]=max(f[cur^1][k<<1],f[cur][k^1<<n]),f[cur][k^1<<n]=-1; cur^=1; } for(int i=0;i<1<<n+1;i++) if(ans<f[cur][i]) ans=f[cur][i]; printf("%d\n",ans); } return 0;}
- HDU2167 Pebbles 题解
- [hdu2167]Pebbles
- 【hdu2167】Pebbles
- hdu2167——Pebbles
- hdu2167--Pebbles(状压dp)
- [hdu2167][DP][状态压缩]Pebbles
- [HDU2167]Pebbles(状压)[第一题]
- [hdu2167]Pebbles(状态压缩dp)
- 【动态规划13】hdu2167 Pebbles(简单状压dp)
- HDU[2167]Pebbles题解
- HDU2167
- Pebbles
- 【POJ2176】Pebbles
- HDU2167 状态压缩DP
- hdu2167之状态压缩
- hdu2167(压缩DP)
- hdu2167之状态压缩
- hdu2167 状态压缩~最优值
- HDU1565 方格取数(1) 题解
- 深入理解Android开发之JNi
- ORACLE数据库测试数据插入速度
- SQL学习1
- app提交App Store 报错
- HDU2167 Pebbles 题解
- c++primer plus复合类型之枚举
- 用户行为分析项目随笔
- org.apache.catalina.startup.bootstrap at localhost:50643 contains obsolete method
- 数据结构之并查集(hdu1988 hdu2492)
- 查找本地所有视频,选择视频上传到服务器
- App 查询版本信息
- HDU1693 Eat the Trees 题解
- 第七届 山东省ACM Feed the monkey(记忆化搜索 OR DP )