如题意,我们需要找一条路,使得我们从左上角到右下角所得的值最大。这道题晃眼一看,像一道搜索的题目,但是如果用搜索就可能会超时。仔细分析,发现第一列和第一行的值只会来自上一个节点,其余的各点会来自左,左斜上,上方三点。所以这是一道dp填标题。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1005][1005];
int main()
{
int n;
scanf("%d",&n);
int k=1;
while(n--)
{
int r,c;;
scanf("%d%d",&r,&c);
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<c;i++) //填第一列
a[0][i]+=a[0][i-1];
for(int i=1;i<r;i++) //填第一行
a[i][0]+=a[i-1][0];
for(int i=1;i<r;i++){
for(int j=1;j<c;j++)
a[i][j]=a[i][j]+max(a[i-1][j-1],max(a[i-1][j],a[i][j-1])); //找左,左斜上,上当中的最大值
}
printf("Scenario #%d:\n",k++);
printf("%d\n\n",a[r-1][c-1]);
}
return 0;
}
*/