一、摘花生问题
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int n,m;
int w[N][N];
int f[N][N];
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&w[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j];
printf("%d\n",f[n][m]);
}
return 0;
}
二、最小通行费
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110,INF = 1e9;
int n;
int w[N][N];
int f[N][N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&w[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==1&&j==1) f[i][j]=w[i][j];
else{
f[i][j]=INF;
if(i>1) f[i][j]=min(f[i][j],f[i-1][j]+w[i][j]);
if(j>1) f[i][j]=min(f[i][j],f[i][j-1]+w[i][j]);
}
printf("%d\n",f[n][n]);
return 0;
}
三、最低通行费
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 15;
int n;
int w[N][N];
int f[N*2][N][N];
int main(){
scanf("%d",&n);
int a,b,c;
while(cin>>a>>b>>c,a||b||c) w[a][b]=c;
for(int k=2;k<=n;k++)
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++){
int j1=k-i1,j2=k-i2;
if(j1>=1&&j1<=n&&j2>=1&&j2<=n){
int t=w[i1][j1];
if(i1!=i2) t+=w[i2][j2];
int &x=f[k][i1][i2];
x=max(x,f[k-1][i1-1][i2-1]+t);
x=max(x,f[k-1][i1-1][i2]+t);
x=max(x,f[k-1][i1][i2-1]+t);
x=max(x,f[k-1][i1][i2]+t);
}
}
printf("%d\n",f[n+n][n][n]);
return 0;
}