大意:例
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;
}