poj1163

来源:互联网 发布:劫的面具淘宝 编辑:程序博客网 时间:2024/06/18 16:51

又一个动态规划 在递归的时候还是出现了问题 对于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 namespacestd;

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;

    return0;

}



原创粉丝点击