大意:例
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
从上往下只能往左边或右边走,求沿途数字最大和。
分析:最简单的DP
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int num[360][360]; int dp[360][360]; int main() { //freopen("C:\in.txt","r",stdin); int n,maxn=0; scanf("%d",&n); for(int i=0;i<n;i++) for(int j=0;j<=i;j++) scanf("%d",&num[i][j]); dp[0][0]=num[0][0]; for(int i=1;i<n;i++) for(int j=0;j<=i;j++) { if(j==0) dp[i][j]=dp[i-1][j]+num[i][j]; else if(j==i) dp[i][j]=dp[i-1][j-1]+num[i][j]; else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+num[i][j]; } for(int i=0;i<n;i++) if(dp[n-1][i]>=maxn) maxn=dp[n-1][i]; cout<<maxn<<endl; // fclose(stdin); return 0; }