1. 程式人生 > >SCU 1114(DP初步_A題)解題報告

SCU 1114(DP初步_A題)解題報告

cst algo bits display pos span bsp view soj

題目鏈接:http://acm.scu.edu.cn/soj/problem.action?id=1114

---------------------------------------------------------------------------------

題意:一個三角形,只能向下或向右下走,要求得到最大值的路線。

思路:從底向上,狀態轉移方程為f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]。

代碼:

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#include
<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll;
const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN = 100+10; int a[MAXN][MAXN]={0}; int f[MAXN][MAXN]={0}; int main(void){ int N= 0; scanf("%d",&N); for(int i=1;i<=N;i++){ for(int j=1;j<=i;j++){ scanf("%d",&a[i][j]); } } for(int
i=1;i<=N;i++){ f[N][i] = a[N][i]; } for(int i=N-1;i>=0;i--){ for(int j=0;j<=i;j++){ f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]; } } printf("%d\n",f[1][1]); int j =1; for(int i=1;i<=N;i++){ if(f[i][j]-f[i+1][j]==a[i][j]){ printf("%d",a[i][j]); }else{ printf("%d",a[i][j]); j++; } if(i==N) printf("\n"); else printf(" "); } return 0; }
View Code

SCU 1114(DP初步_A題)解題報告