很明显的动态规划方法,可以开三个数组,一个存放好感度,一个存放动态规划迭代的该店的最大好感度,一个布尔型二维数组,标记是否走过,并设置一个布尔量标记是否到达了右下角如到达即坐上遍历,保证右下和左上过程中不走重复路线,设置一个ans量记录最大好感度,每次遍历到达左上角时,更新一次,保证ans为当前已经遍历路线的最大好感度,最后输出ans
上代码:
#include<iostream>
#include<vector>
using namespace std;
int m,n;
int ans;
void dfs(int i1,int j1,int i2,int j2,int*a,int*dp,int*been,bool rightdown){
if(i2==0&&j2==0){
ans=max(ans,*(dp+i1*n+j1));
}
if(i2>=0&&i2<m&&*(been+i2*n+j2)==0&&j2>=0&&j2<n){
*(dp+i2*n+j2)=max(*(dp+i2*n+j2),*(dp+i1*n+j1)+*(a+i2*n+j2));
// ans=max(ans,*(dp+i2*n+j2));
*(been+i2*n+j2)=1;
if(i2==m-1&&j2==n-1){
rightdown=false;
}
if(rightdown){
dfs(i2,j2,i2,j2+1,a,dp,been,rightdown);
dfs(i2,j2,i2+1,j2,a,dp,been,rightdown);
}
else{
dfs(i2,j2,i2-1,j2,a,dp,been,rightdown);
dfs(i2,j2,i2,j2-1,a,dp,been,rightdown);
}
*(been+i2*n+j2)=0;
*(dp+i2*n+j2)=0;
}
#include<vector>
using namespace std;
int m,n;
int ans;
void dfs(int i1,int j1,int i2,int j2,int*a,int*dp,int*been,bool rightdown){
if(i2==0&&j2==0){
ans=max(ans,*(dp+i1*n+j1));
}
if(i2>=0&&i2<m&&*(been+i2*n+j2)==0&&j2>=0&&j2<n){
*(dp+i2*n+j2)=max(*(dp+i2*n+j2),*(dp+i1*n+j1)+*(a+i2*n+j2));
// ans=max(ans,*(dp+i2*n+j2));
*(been+i2*n+j2)=1;
if(i2==m-1&&j2==n-1){
rightdown=false;
}
if(rightdown){
dfs(i2,j2,i2,j2+1,a,dp,been,rightdown);
dfs(i2,j2,i2+1,j2,a,dp,been,rightdown);
}
else{
dfs(i2,j2,i2-1,j2,a,dp,been,rightdown);
dfs(i2,j2,i2,j2-1,a,dp,been,rightdown);
}
*(been+i2*n+j2)=0;
*(dp+i2*n+j2)=0;
}
}
int main(){
int N;
scanf("%d",&N);
while(N--){
cin>>m>>n;
int a[m][n];//各个同学的好心度
int dp[m][n];//好心度的迭代
int been[m][n];//是否走过
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
dp[i][j]=0;
been[i][j]=0;
// cin>>a[i][j];
scanf("%d",&a[i][j]);
}
}
a[0][0]=0;
a[m][n]=0;
dfs(0,0,0,0,&a[0][0],&dp[0][0],&been[0][0],true);
printf("%d",ans);
}
return 0;
}
int main(){
int N;
scanf("%d",&N);
while(N--){
cin>>m>>n;
int a[m][n];//各个同学的好心度
int dp[m][n];//好心度的迭代
int been[m][n];//是否走过
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
dp[i][j]=0;
been[i][j]=0;
// cin>>a[i][j];
scanf("%d",&a[i][j]);
}
}
a[0][0]=0;
a[m][n]=0;
dfs(0,0,0,0,&a[0][0],&dp[0][0],&been[0][0],true);
printf("%d",ans);
}
return 0;
}