HDU-2084 数塔(简单DP入门)

题目地址  http://acm.hdu.edu.cn/showproblem.php?pid=2084

如果熟悉回溯法,可能会立刻发现这是一个动态规划的决策问题:每次有两种选择——左下或右下。如果用回溯法求出所有可能路线,就可以从中选出最优路线。但是,回溯法效率太低:一个n层的数字三角形的完整路线有2^n-1条,当n很大时,回溯法让人SXBK。

于是,晴天霹雳一声响,DP开始入门了!首先,列出来状态转移方程 d(i,j) = a(i,j) + max{ d(i+1,j),d(i+1,j+1) };

DP最重要的就是列出方程,那么这个方程怎么实现呢?! 以下有三个基本方法:

1.递归计算

2.递推计算

3.记忆化搜索

(具体讲解在后面博文写出,下面贴出此题AC代码)


#include 
#include 
#include 
#include 

using namespace std;

const int maxn = 110;
int G[maxn][maxn]={0},d[maxn][maxn]={0};
int C,n;

int dp(int i,int j){
    if(d[i][j]>0) return d[i][j];
    return d[i][j]=G[i][j]+( i==n ?0 :max(dp(i+1,j),dp(i+1,j+1)) );
}

int main(){
    int i,j;
    scanf("%d",&C);
    while(C--){
        memset(G,0,sizeof(G));
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            for(j=1;j<=i;j++)
                scanf("%d",&G[i][j]);
/*
        for(i=1;i<=n;i++){
            for(j=1;j



你可能感兴趣的:(菜鸟的ACM之路(HDU),hdu,dp)