动态规划习题 poj1163

原题:

The Triangle
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 28546   Accepted: 16809

Description

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right. 

Input

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

Sample Output

30

题目要求:

输入三角形如图所示:在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都是能往左下或右下走。只需要求出最的和即可,不需要输出路径。

              7

                                 3   8

                               8   1   0

                             2   7   4   4

                           4   5   2   6   5

题目解析:

用二维数组way[][]靠左存储三角形内的数据,如下图:

                             0 0

                             0 7 0

                             0 3 8 0                        

                             0 8 1 0 0                         

                             0 2 7 4 4 0                       

                             0 4 5 2 6 5 0 

利用动态规划:way[i][j]=way[i][j]+max(way[i-1][j-1],way[i-1][j])

代码:

#include<iostream>
using namespace std;

int max(int a,int b)
{
    return a>b?a:b;
}

int main()
{
    int n;
    int i,j;
    while(cin>>n)
    {
        int **way=new int*[n+1];   //动态申请二维数组的第一维,每个元素都是一个一维数组的指针

        /*Input & Initial*/

        for(i=0;i<=n;i++)
        {
            way[i]=new int[i+2]; //动态申请二维数组的第二维,每一行的空间
            for(j=0;j<=i+1;j++)
                way[i][j]=0;   //不能用memset初始化

            if(i!=0)
                for(j=1;j<=i;j++)
                    cin>>way[i][j];
        }

        /*Dp*/

        int max_weight=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=i;j++)
            {
                way[i][j] += max(way[i-1][j-1],way[i-1][j]);
                if(i==n && max_weight<way[i][j])
                    max_weight=way[i][j];
            }

        cout<<max_weight<<endl;

        delete[] way;
    }
    return 0;
}

 

 

posted @ 2012-05-18 17:35  王耀it  阅读(186)  评论(0编辑  收藏  举报