【题目链接】信息学奥赛一本通1284:摘花生
【题解思路】
动态规划:
状态表示:f[ i ][ j ]表示到达( i , j )能得到的最大花生数
状态计算:只能向东或向南走,所以a[ i ][ j ]可以接在a[ i ][ j -1 ]和a[ i-1 ][ j ]后面,取最大值。
即f[ i ][ j ]=max(a[ i ][ j ], max( f[ i-1 ][ j ]+a[ i ][ j ],f[ i ][ j-1 ]+a[ i ][ j ]) );
数据范围1到100,双重循环遍历即可。
【代码】
#include<iostream>
using namespace std;
const int N=100+10;
int n,m;
int a[N][N];
int f[N][N]; //f[i][j]:到达(i,j)能得到的最大花生数
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
int ma=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=a[i][j];
f[i][j]=max(f[i][j], max(f[i-1][j]+a[i][j],f[i][j-1]+a[i][j]) );
ma=max(ma,f[i][j]);
}
}
cout<<ma<<endl;
}
int main()
{
int num=1;
cin>>num;
while(num--)
{
solve();
}
return 0;
}