方格取数(1) HDU
来源:互联网 发布:linux下的网络编程 编辑:程序博客网 时间:2024/05/17 22:17
给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
Input
包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20)
Output
对于每个测试实例,输出可能取得的最大的和
Sample Input
3
75 15 21
75 15 28
34 70 5
Sample Output
188
比较明显的状压dp。
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<queue>#define INF 0x3f3f3f3fusing namespace std;int a[25][25];int dp[20000][21];int state[20000];int k;void init(int n){ k=0; for(int i=0;i<(1<<n);i++) if(!(i&(i<<1))) state[k++]=i;}int main(){ int n; while(scanf("%d",&n)==1) { init(n); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=0;i<k;i++) { for(int j=1;j<=n;j++) { if(state[i]&(1<<(j-1))) dp[i][1]+=a[1][j]; } } for(int i=2;i<=n;i++) { for(int j=0;j<k;j++) { for(int l=1;l<=n;l++) if(state[j]&(1<<(l-1))) dp[j][i]+=a[i][l]; int temp=0; for(int s=0;s<k;s++) if(!(state[s]&state[j])) temp=max(temp,dp[s][i-1]); dp[j][i]+=temp; } } int ans=0; for(int i=0;i<k;i++) ans=max(ans,dp[i][n]); printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 方格取数(1) HDU
- HDU 1565 方格取数(1)
- hdu 1565 方格取数(1)
- HDU-1565-方格取数(1)
- hdu 1565 方格取数(1)
- HDU 1565 方格取数(1)
- hdu(1565)方格取数(1)
- hdu 1565 方格取数(1)
- hdu 1565 方格取数(1)
- hdu 1565 方格取数(1)
- HDU - 1565 方格取数(1) (DP)
- hdu 1565 方格取数(1)
- HDU 1565 方格取数(1)
- HDU 1565 方格取数(1)
- hdu acm 1565 方格取数(1)
- HDU 1565 方格取数(1)
- HDU - 1565 方格取数(1)
- HDU 1565 方格取数(1)
- linux shell使用loop和cursor批量修改sql
- 静态代码块的执行顺序
- POJ 2406 Power Strings(后缀数组或KMP或扩展KMP)
- 在Matlab下利用VS调试C/C++代码
- Linux系统Java环境安装配置
- 方格取数(1) HDU
- 传入一个字符串,输出某个字符或者字符串在传入字符串中的所有位置
- 11.2
- CVPR 2017 全部及部分论文解读集锦
- 朴素贝叶斯
- 吴恩达深度学习第四课:卷积神经网络(学习笔记2)
- Miller_Rabin素数测试与Pollard_Rho分解质因数
- 百度大脑--二进制图像数据格式转换问题
- 7-1 两个有序链表序列的合并