HDOJ2084 数塔(DP)
2017-08-11 09:04
393 查看
HDOJ 2084
这是一道非常经典的一道动态规划题目。
运用了顺推法,我感觉很像记忆化搜索。每一层每一个位置都存放着当前位置的最大值。
将一个问题分为很多子问题,每一次解决一个子问题(也就是一层,一个状态)。如果我们能保存已解决子问题的答案,用一个表记录下来,不管用到用不到,只要计算过,就放到表里。这就是动态规划的基本思想。
bd27
这是一道非常经典的一道动态规划题目。
运用了顺推法,我感觉很像记忆化搜索。每一层每一个位置都存放着当前位置的最大值。
将一个问题分为很多子问题,每一次解决一个子问题(也就是一层,一个状态)。如果我们能保存已解决子问题的答案,用一个表记录下来,不管用到用不到,只要计算过,就放到表里。这就是动态规划的基本思想。
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; const int maxn=10010; int a[maxn][maxn],dp[maxn][maxn]; int max(int x,int y){reutrn x>y?x:y;} void get(int n){ int i,j; for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ if(i==1&&j==1) dp[i][j]=a[i][j]; //第一层第一个 else if(j==1) dp[i][j]=dp[i-1][j]+a[i][j];//第2到n层第一列,第一列左上没元素 else if(j==i) dp[i][j]=dp[i-1][j-1]+a[i][j]; //第2到n层最后一列,右上角没元素 else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]; } } } int main(){ int t,i,j,n; cin>>t; while(t--){ cin>>n; //数塔n层 for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ cin>>a[i][j]; } } get(n); int ans=0; for(j=1;j<=n;j++){ ans=max(ans,dp [j]); } cout<<ans<<endl; } return 0; }
bd27
相关文章推荐
- HDOJ_杭电2084_数塔问题,经典阶段DP动态规划问题
- HDoj-2084-数塔-dp
- HDOJ 2084 数塔 【dp】
- hdoj 2084(非记忆式dp)
- HDOJ 2084 数塔 【dp】
- HDOJ 2084 数塔【简单DP】
- HDOJ.2084 数塔(DP)
- HDOJ-2084 数塔问题[DP入门]
- hdoj2084 数塔(dp基础题)
- 简单dp,hdoj2084(数塔)
- HDoj-2084-号码塔-dp
- hdoj 2084 数塔 【经典DP】
- HDOJ 2084 数塔-简单DP
- hdoj 2084 数塔(经典dp)
- hdoj 1227 Fast Food 【dp】
- hdoj 1466 计算直线的交点数 【经典DP】
- HDOJ 1087 Super Jumping! (DP)
- HDOJ 题目4833 Best Financing(DP)
- HDOJ 5115 Dire Wolf 区间DP
- hdoj 5570 balls 【概率dp 求期望】