poj1163

又一个动态规划 在递归的时候还是出现了问题 对于maxsum和max产生了混淆 还是要把整个程序在纸上写出来才能知道全部过程 是从三角形顶端一直往下走再返回的过程

#include <iostream>

#include <algorithm>

using namespacestd;

int n, dp[105][105];

int Maxsum[105][105];//这里是动态规划

int maxsum(int i,int j){

    int x, y;

    if(Maxsum[i][j] != -1){

        returnMaxsum[i][j];

    }

    if(i ==n){

        Maxsum[i][j] =dp[i][j];

    }

    else{

        x = maxsum(i +1, j);

        y = maxsum(i +1, j +1);

        Maxsum[i][j] =max(x, y) +dp[i][j];

    }

    returnMaxsum[i][j];

}

int main(int argc,constchar * argv[]) {

    int i, j;

    scanf("%d",&n);

    memset(Maxsum, -1,sizeof(Maxsum));//初始化 可以方便储存动态规划的数据

    for(i =1; i <=n; i ++){

        for(j =1;j <= i; j ++){

            cin >>dp[i][j];

        }

    }

    cout <<maxsum(1,1) <<endl;

    return0;

}

这里还有一个递推的方法 强烈推荐mooc上的北大算法课 思路非常清楚 连本小白都能听懂啦

#include <iostream>

#include <algorithm>

using namespace std;

int n, dp[105][105];

int maxsum[105][105];

int main(int argc, const char * argv[]) {

    int i, j;

    scanf("%d",&n);

    for(i = 1; i <= n; i ++){

        for(j = 1;j <= i; j ++){

            cin >> dp[i][j];

        }

    }

    for(i = 1; i <= n; i ++){

        maxsum[n][i]=dp[n][i];

    }

    for(i = n-1; i >= 1; i --){

        for(j = 1; j <= i; j ++){

            maxsum[i][j] = max(dp[i+1][j],dp[i+1][j+1])+dp[i][j];

        }

    }

    cout << maxsum[1][1] << endl;

    return 0;

}

//这里是节约空间的做法 将二维数组降为一位数组 再变为指针 指针的用法又忘记了,,

#include <iostream>

#include <algorithm>

using namespace std;

int n, dp[105][105];

int * maxsum;

int main(int argc, const char * argv[]) {

    int i, j;

    scanf("%d",&n);

    for(i = 1; i <= n; i ++){

        for(j = 1;j <= i; j ++){

            cin >> dp[i][j];

        }

    }

    maxsum = dp[n];

    for(i = n-1; i >= 1; i --){

        for(j = 1; j <= i; j ++){

            maxsum[j] = max(maxsum[j],maxsum[j+1])+dp[i][j];

        }

    }

    cout << maxsum[1] << endl;

    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值