南阳理工学院oj上的传纸条

很明显的动态规划方法,可以开三个数组,一个存放好感度,一个存放动态规划迭代的该店的最大好感度,一个布尔型二维数组,标记是否走过,并设置一个布尔量标记是否到达了右下角如到达即坐上遍历,保证右下和左上过程中不走重复路线,设置一个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;
 }
}
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;
}

发布了14 篇原创文章 · 获赞 2 · 访问量 5391

猜你喜欢

转载自blog.csdn.net/Wolf_South/article/details/78607989
今日推荐