动态规划 DP

来源:互联网 发布:淘宝精品服饰广告案例 编辑:程序博客网 时间:2024/06/02 05:52

    数字三角形(POJ1163)

    

    在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99

    输入格式:

    5      //表示三角形的行数    接下来输入三角形

    7

    3   8

    8   1   0

    2   7   4   4

    4   5   2   6   5

    要求输出最大和

思路嘛。从倒数第二排往前 每个maxS[i][j]都存放到i,j这个位置最大的值 

#include <iostream>using namespace std;int  maxS[102][102];int  D[111][111];int n;int max(int a, int b){if (a > b)return a;return b;}int  maxSum(int i, int j);int  maxSum(int i, int j)//这个是简版递归{
//maxS是存放当前位置的最大值,被初始化为-1if (maxS[i][j] != -1)//访问1 1这个元素 肯定是-1 于是就算开启递归    return maxS[i][j];if (i==n){maxS[i][j] = D[i][j];}else{maxS[i][j] = max(maxSum(i+1,j), maxSum(i+1,j+1)) + D[i][j];}return maxS[i][j];}int main(){cin >> n;   /*  for (int i = 1; i <= n; i++)for (int j = 1; j <= i;j++){cin >> D[i][j];maxS[ i][j] = -1;}cout << maxSum(1, 1);*/
//这上面是递归
for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++){cin >> D[i][j];}for (int i = n - 1; i >= 1; i--)for (int j = 1; j <= n; j++){D[i][j] = max(D[i + 1][j], D[i + 1][j + 1])+D[i][j];
//这个是不用创建数组,直接把D[i][j]修改了,省空间。
}cout << D[1][1];system("pause");}

0 0
原创粉丝点击