洛谷:P2196 挖地雷(dp基础,递归)

题目:

在这里插入图片描述

分析:和滑雪问题一样。

代码:

#include<bits/stdc++.h>
using namespace std;
int A[20][20];
int B[20];
int n;
int D[20];
int f(int x)
{
 if(D[x]!=-1) return D[x];
 D[x]=0;
 for(int i=x+1;i<n;i++)
 {
  if(A[x][i]) D[x]=max(D[x],f(i));
 }
 return D[x]=B[x]+D[x];
}
void out(int x)
{
 int maxx=-1;
 for(int i=x+1;i<n;i++)
 {
  if(A[x][i])
  {
   if(D[maxx]<D[i]) 
   {
    maxx=i;
   }
  }
 }
 if(maxx==-1) return;
 cout<<' '<<maxx+1;
 out(maxx);
}
int main()
{
 memset(A,0,sizeof(A));
 memset(D,-1,sizeof(D));
 cin>>n;
 for(int i=0;i<n;i++) cin>>B[i];
 for(int i=0;i<n;i++)
 for(int j=i+1;j<n;j++) cin>>A[i][j];
 int maxx=-1;
 for(int i=0;i<n;i++) 
 maxx=max(maxx,f(i));
 for(int i=0;i<n;i++)
 {
  if(maxx==D[i])
  {
   cout<<i+1;
   out(i);
   break;
  }
 }
 cout<<endl<<maxx; 
}

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/107517679
今日推荐