洛谷 P2196 挖地雷 & [NOIP1996提高组](搜索,记录路径)
传送门
解题思路
就是暴力!!!
没什么好说的,总之,就是枚举每一个起点,然后暴力算一遍以这个点为起点的所有路径,在算的过程中,只要比目前找到的答案更优,就有可能是最后的答案,于是就把路径更新一遍,保证不错过正确答案。
由于数据很水<21,所以放心暴力!
AC代码
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int n,m[21][21],maxx[21]; 5 int a[21],sans[21],now[21],ans,nows; 6 void dfs(int x,int value,int step){ 7 now[step]=x; 8 if(value>ans){ 9 for(int i=1;i<=step;i++) sans[i]=now[i]; 10 ans=value; 11 nows=step; 12 } 13 maxx[x]=a[x]; 14 for(int i=1;i<=n;i++){ 15 if(m[x][i]&&maxx[i]==-1){ 16 dfs(i,value+a[i],step+1); 17 maxx[i]=-1; 18 } 19 } 20 } 21 int main() 22 { 23 cin>>n; 24 for(int i=1;i<=n;i++) cin>>a[i]; 25 for(int i=1;i<=n;i++){ 26 for(int j=i+1;j<=n;j++){ 27 char c; 28 cin>>c; 29 if(c=='1') m[i][j]=1; 30 } 31 } 32 for(int i=1;i<=n;i++){ 33 memset(maxx,-1,sizeof(maxx)); 34 dfs(i,a[i],1); 35 } 36 for(int i=1;i<=nows;i++) cout<<sans[i]<<" "; 37 cout<<endl<<ans; 38 return 0; 39 }
//NOIP1996提高组 t3