本题可以用搜索做,但是会很耗时。
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=1058
用DP,方程式:f[i][j] = max(f[i-1][j],f[i-1][j-1]) + map[i][j];(将三角形逆时针旋30度后)
经典的方格取数问题。
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
int map[1002][1002];
int f[1002][1002];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int r;
while(scanf("%d",&r)!=EOF)
{
memset(map,0,sizeof(map));
memset(f,0,sizeof(f));
for(int i=0; i<r; i++)
{
for(int j=0; j<=i; j++)
{
scanf("%d",&map[i][j]);
}
}
for(int i=0; i<r; i++)
{
for(int j=0; j<=i; j++)
{
if(i==0 && j==0)
{
f[i][j] = map[i][j];
}
else if(j == 0)
{
f[i][j] = f[i-1][j] + map[i][j];
}
else
{
f[i][j] = max(f[i-1][j],f[i-1][j-1]) + map[i][j];
}
}
}
int ans = 0;
for(int i=0; i<r; i++)
{
if(f[r-1][i] > ans)
{
ans = f[r-1][i];
}
}
printf("%d\n",ans);
}
return 0;
}