摘花生这道题我写了两种方法,一种超时的深度优先搜索,另一种是不超时的线性规划
深度优先搜索(超时,当作练习)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[110][110];
bool book[110][110];
int xs[2]={1,0},ys[2]={0,1};
int n,m;
int ans=0;
int res=0;
void dps(int x,int y)
{
if(x==n-1&&y==m-1)
{
res=max(ans,res);
return;
}
for(int i=0;i<2;i++)
{
int xx=x+xs[i];
int yy=y+ys[i];
if(xx<0||yy<0||xx>=n||yy>=m)continue;
if(book[xx][yy]==true)continue;
ans+=dp[xx][yy];
book[xx][yy]=true;
dps(xx,yy);
book[xx][yy]=false;
ans-=dp[xx][yy];
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(dp,0,sizeof dp);
ans=0,res=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>dp[i][j];
}
}
ans=dp[0][0];
dps(0,0);
cout<<res<<endl;
}
return 0;
}
线性规划做法(正规解法)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[110][110];
int n,m;
int main()
{
int t;
cin>>t;
while(t--)
{
memset(dp,0,sizeof dp);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>dp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=max(dp[i-1][j]+dp[i][j],dp[i][j-1]+dp[i][j]);
}
}
cout<<dp[n][m]<<endl;
}
return 0;
}