其他分享
首页 > 其他分享> > P2196 挖地雷

P2196 挖地雷

作者:互联网

P2196 挖地雷

把一道DP题当爆搜做…

题意描述

挖地雷啊挖地雷,那条路最多走那条,没了。

你八成是看不懂的,所以请走传送门

算法分析

显然是一道DP题,但这么简单的DP怎么能直接切呢(好吧我承认是我不会DP)

所以为了提高难度,我把他当搜索做(最近搜索题做多了的后遗症)

搜索很简单,就不细讲了。

代码实现

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;

int n,a[30],way[30][30];
int path[30],tot,ans=0,an[30];
bool use[30];

bool check(int x){
   for(int i=1;i<=n;i++){
     if(way[x][i]&&!use[i]) return false;
   }
   return true;
 }

void dfs(int last,int step,int sum){
   if(check(last)){
     if(sum>ans){
       ans=sum;
       tot=step;
       for(int i=1;i<=step;i++) an[i]=path[i];
     }
     return;
   }

for(int i=1;i<=n;i++){
     if(way[last][i]&&!use[i]){
       path[step+1]=i;
       use[i]=true;
       dfs(i,step+1,sum+a[i]);
       use[i]=false;
     }
   }
   return;
 }

int main(){
   scanf("%d",&n);
   for(int i=1;i<=n;i++) scanf("%d",&a[i]);
   for(int i=1;i<n;i++){
     for(int j=i+1;j<=n;j++){
       scanf("%d",&way[i][j]);
     }
   }

for(int i=1;i<=n;i++){
     path[1]=i;
     use[i]=true;
     dfs(i,1,a[i]);
     use[i]=false;
   }

for(int i=1;i<=tot;i++) printf("%d ",an[i]);
   printf("\n%d\n",ans);
   //system("pause");
   return 0;
}

结语

没了

标签:挖地雷,P2196,int,30,ans,include,DP
来源: https://www.cnblogs.com/lpf-666/p/12436224.html