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