方格取数(1) (状态dp)
来源:互联网 发布:如何测试端口通不通 编辑:程序博客网 时间:2024/05/29 06:34
给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
375 15 21 75 15 28 34 70 5
188
题目大概:
给出一个n*n大小的矩阵,找出给矩阵内的最大和,要求这些数之间不能相邻。
思路:
与种玉米很像。
不过每一个位置多了一个状态,这就即需要预处理出所有的符合条件的状态,又需要预处理出每一行状态的和。
主要是预处理太麻烦。
dp【i】【j】就是到第i行时j状态时的最大和。
方程dp[i][j]=max(dp[i][j],dp[i-1][k]+stt[i][j]);
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int ma=22;const int mm=21000;int st[mm];int stt[ma][mm],dp[ma][mm],map[ma][ma];int cnt;void find(int n){ int sum=1<<n; cnt=1; for(int i=0;i<sum;i++)//枚举状态 { if((i&(i<<1))==0)//判断给状态两个1之间不能挨着 { st[cnt++]=i;//符合条件记录状态 } }}int main(){ int n; while(~scanf("%d",&n)) { memset(st,0,sizeof(st)); memset(stt,0,sizeof(stt)); memset(dp,0,sizeof(dp)); cnt=0; find(n);//预处理 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&map[i][j]); } } for(int i=1;i<=n;i++)//枚举每一行 { for(int j=1;j<=cnt;j++)//枚举每一个状态 { int sum=n; for(int k=1;k<(1<<n);k=(k<<1))//计算出该状态的和 { if((k&st[j])!=0) { stt[i][j]+=map[i][sum]; } sum--; } } } for(int i=1;i<=cnt;i++)//更新第一行 { dp[1][i]=stt[1][i]; } for(int i=2;i<=n;i++)//枚举行 { for(int j=1;j<=cnt;j++)//枚举状态 { for(int k=1;k<=cnt;k++)//枚举前一个状态 { if((st[j]&st[k])==0)//两个状态不能有挨着的元素 { dp[i][j]=max(dp[i][j],dp[i-1][k]+stt[i][j]); } } } } int sum=0; for(int i=1;i<=cnt;i++) { sum=max(sum,dp[n][i]); } printf("%d\n",sum); } return 0;}
阅读全文
0 0
- 方格取数(1) (状态dp)
- HDU1565方格取数(1)(状态压缩DP)
- hdu 1565 方格取数(1)(状态压缩DP)
- hdu 1565 方格取数(1) (状态压缩dp)
- HDU 1565 方格取数(1) (状态压缩DP)
- hdu 1565 方格取数(1)(状态压缩dp)
- HDU 1565 方格取数(1) (状态压缩 DP)
- hdu 1565 方格取数(1) (状态压缩DP)
- hdu 1565 方格取数(1)(DP 状态压缩)
- hdu 1565 方格取数(1)(状态压缩dp)
- HDU1565 方格取数(1) (状态压缩DP)
- HDU-1565 方格取数(1) 状态压缩DP
- HDU 1565 方格取数(1) (状态dp)
- HDU1565:方格取数(1) (状态压缩DP)
- HDU 1565 方格取数(1)(状态压缩DP)
- hdu 1565 方格取数(1) 状态压缩+dp
- HDU 1565 方格取数(1) 状态压缩DP
- hdu 1565 方格取数(1) (状态压缩DP)
- 【计算机算法分析】递归与分治策略——二分搜索与集合划分问题
- angular表单添加查询删除
- Picasso的简单使用及封装
- 【Eclipse】安装html/jsp/xml插件
- hdoj 1180 搜索 + bfs + 优先队列
- 方格取数(1) (状态dp)
- Linux运维学习笔记之十二:http协议和www服务
- python 3 笔记
- 已知半径和两圆相交面积求圆心距
- JS——计时器
- 机房收费系统之注册窗体
- Zookeeper工作原理(详细)
- Android图片加载框架最全解析(一),Glide的基本用法
- 如何通过jQuery实现select下拉框的联动效果