hdoj2571【DP基础】
2016-05-31 21:24
204 查看
题意:中文题/
思路:DP的思想要理解,就是从上一个最优状态使被传到的状态也是最优状态。因为很久没有打DP,所以连简单地这样的都wa了6次;(QAQ废话不多说)。
题目要求是从(x,y)到(x,y+1)/(x+1,y)/(x,y*k),那么很明显dp[i][j]=max(前面的状态+dp[i][j]),但是你以为就这样而已么?
1.边界问题,在两个边界上,对于(列)j=1那一列,dp[i][j]只=dp[i][j]+dp[i-1][j];
2.初始化DP数组问题,这个的话要看具体实现了,如果你使用了不该用的状态就要有那个状态的定义。每一个状态的转变都要有定义,在条件上和限制上最优的定义。
code:
思路:DP的思想要理解,就是从上一个最优状态使被传到的状态也是最优状态。因为很久没有打DP,所以连简单地这样的都wa了6次;(QAQ废话不多说)。
题目要求是从(x,y)到(x,y+1)/(x+1,y)/(x,y*k),那么很明显dp[i][j]=max(前面的状态+dp[i][j]),但是你以为就这样而已么?
1.边界问题,在两个边界上,对于(列)j=1那一列,dp[i][j]只=dp[i][j]+dp[i-1][j];
2.初始化DP数组问题,这个的话要看具体实现了,如果你使用了不该用的状态就要有那个状态的定义。每一个状态的转变都要有定义,在条件上和限制上最优的定义。
code:
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; int dp[30][1010]; int n,m; void debug() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { printf("%d ",dp[i][j]); } puts(""); } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&dp[i][j]); } } for(int i=2;i<=n;i++) { dp[i][1]+=dp[i-1][1]; } int temp; for(int i=1;i<=n;i++) { for(int j=2;j<=m;j++) { if(i==1) temp=dp[i][j-1]; else if(j==1) temp=dp[i-1][j]; else temp=max(dp[i-1][j],dp[i][j-1]); for(int k=1;k<j;k++) { if(!(j%k)) temp=max(temp,dp[i][k]); } dp[i][j]+=temp; } } //debug(); printf("%d\n",dp [m]); } return 0; }
相关文章推荐
- hdu_2955_Robberies(01背包)
- hiho_1079_离散化
- epoll实现socket通信
- 寻址方式
- change backgroud color of the windows in ubuntu
- Linux Centos的Inode及Block相关知识
- 校个人赛——02
- 2016届毕业设计(论文) 基本规范及档案袋封面填写要求
- Codeforces Round #347 (Div. 2) B. Rebus
- sdut第八届校赛--小厚的三角形
- 三次学习ssession和cookie
- 线性规划求解路径问题
- VC++动态链接库编程之MFC DLL
- Intent的用法
- Matlab 图像预处理
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别
- linux 终端常用快捷键
- Linux ssh 下的简单 IM 通信
- 百度地图
- 高级I/O---多路复用---select