poj 1163 The Triangle(DP水水 = =第二次写!)

第一道自己做出来的DP。。。呃。。当然几天前CW讲过了。

 

DP是个蛮神奇蛮深奥的东东,嘿嘿,不过感觉挺有意思的,就是难了点。

 

这个是比较水的吧,求出从上面到下面权值最大的一条路径,可以向下方走,或者右下方走,输出这条路径。

 

DP是从下往上计算的,算出每个子结构的最大值,一直算到最顶上的那个数。

 

第一个代码用的二维,过了后想用一维,不过一看读入数据郁闷了。。。这个杂用一维啊。。。

 

我的一维就相当于二维了 = = 没啥技术含量。。。不过省内存啊~因为数组不用开恁大~

 

二维的

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int main(void) { int n; int a[102][102]; while( cin >> n ) { for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) cin >> a[i][j]; for(int i=n-1; i>=1; i--) { for(int k=1; k<=i; k++) { if( a[i+1][k] > a[i+1][k+1] ) a[i][k] += a[i+1][k]; else a[i][k] += a[i+1][k+1]; } } cout << a[1][1] << endl; } return 0; }  

 

一维的

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int main(void) { int n; int a[6000]; while( cin >> n ) { for(int i=1; i<=n*(n+1)/2; i++) cin >> a[i]; for(int j=n-1; j>=1; j--) for(int i=j*(j+1)/2; i>j*(j-1)/2; i--) { if( a[i+j] > a[i+j+1] ) a[i] += a[i+j]; else a[i] += a[i+j+1]; } cout << a[1] << endl; } return 0; }  

你可能感兴趣的:(poj 1163 The Triangle(DP水水 = =第二次写!))