The Triangle[1163@pku]

第一种方式:备忘录
//@pku 1163 DY问题
//最基础的DY问题,采用的是备忘录方式
//在max(dp(r+1,c),dp(r+1,c+1))处错写成了max(s[r+1][c],s[r+1][c+1]),导致了调试时间。
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;

#define N 120
#define fin cin

int v[N][N];
int s[N][N];
int n;
int dp(int r, int c);//adopt the memoization method
int main()
{
    //ifstream fin("input.txt");
    while(fin>>n){
        for(int i=1;i<=n;i++)//read the data
            for(int j=1;j<=i;j++)
                fin>>v[i][j];
        memset(s,-1,sizeof(s));//intialize the sum
        cout<<dp(1,1)<<endl;
    }//end while
    return 0;
}

int dp(int r, int c)//adopt the memoization method
{
    if(r==n)//is the lastest line
        return s[r][c]=v[r][c];
    if(s[r][c]!=-1)//has been caluated
        return s[r][c];
    else
        return s[r][c]=v[r][c]+max(dp(r+1,c),dp(r+1,c+1));
}
第二种方式:迭代
//pku 1163 DY 问题
//采用的是迭代的方式
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;

#define N 120
#define fin cin
int v[N][N];
int s[N];

int main()
{
    //ifstream fin("input.txt");
    int n;
    while(fin>>n){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=i;j++)
                fin>>v[i][j];
    
        for(int i=1;i<=n;i++)
            s[i]=v[n][i];

        //每个数的最大值只和它的下一行的数算出的最大值有关。
        for(int i=n-1;i>=1;i--)
            for(int j=1;j<=i;j++)//j只能是从1开始,而不能是从i开始,因为这样数据会被覆盖
                s[j]=v[i][j]+max(s[j],s[j+1]);
        cout<<s[1]<<endl;
    }//end while

    return 0;
}

posted on 2012-02-27 10:15 DjvuLee 阅读(163) 评论(0)  编辑 收藏 引用 所属分类: 动态规划


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2013年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿

随笔分类(13)

随笔档案(19)

文章分类(2)

文章档案(1)

搜索

最新评论

评论排行榜