数字三角形,从头开始走,往下走,每次只能选择左或右,问走到最底最大的数是多少。
学长说这是最简单的DP题,可能连DP都算不上。
自己推出了状态转移方程,但是遍历的时候不知道从底开始往上遍历,最后输出dp[0][0]就ok了。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int N;
int dp[351][351];
int a[351][351];
while(scanf("%d", &N)!=EOF)
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
scanf("%d", &a[i][j]);
dp[i][j] = a[i][j];
if(i == j)
break;
}
}
for(int i = N - 1; i >= 0; i--)//debug
{
for(int j = 0; j < N; j++)
{
dp[i][j] = a[i][j] + max(dp[i + 1][j], dp[i + 1][j + 1]);
if(i == j)
break;
}
}
printf("%d\n", dp[0][0]);
}
return 0;
}