17 数字三角形 初入dp
Description
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。
Input
输入数据有多组,每组输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
Output
输出最大的和。
Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 3 1 2 3 1 1 1
Sample Output
30 5
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int data[200][200];//定义数组 6 int n,tmp; 7 while(cin>>n) 8 { 9 n=n+1;//这是个问题不明白为啥 10 for(int i=0;i<n;i++) 11 { 12 for(int j=0;j<i;j++) 13 cin>>data[i][j]; 14 } 15 for(int i=0;i<n;i++) 16 { 17 for(int j=0;j<i;j++) 18 { 19 if(j==0)//判断边界问题 20 data[i][j]=data[i-1][j]+data[i][j]; 21 else 22 data[i][j]=max(data[i-1][j],data[i-1][j-1])+data[i][j];//由上往下推出结果 23 } 24 } 25 tmp=0; 26 for(int j=0;j<n;j++)//找出最大值 27 if(tmp<data[n-1][j]) 28 tmp=data[n-1][j]; 29 cout<<tmp<<endl; 30 } 31 return 0; 32 }
第一道dp问题,这个题的思路就是,由上到下依次存起来
高手的这个问题 http://blog.csdn.net/lalor/article/details/6954923