这道题很水的
显然是个dp
题目似乎有个问题
他没有说边是单向的(如果说了,就当我眼瞎)
反正我一开始以为是双向的,结果被卡了一会
但是看清是单向的,还是简单的
用f[i]表示以i为终点的最大挖雷数
不讲了,感觉太简单了
自己看看代码吧!我是重来不浓缩代码的,应该很易懂
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int f[25];
int mapp[25][25];
int num[25];
int getd(int cur){
if(f[cur]>=0){
return f[cur];
}
for(int i=cur-1;i>=0;i--){
if(mapp[i][cur]){
f[cur]=max(f[cur],getd(i)+num[cur]);
}
}
if(f[cur]==-1){
f[cur]=num[cur];
}
return f[cur];
}
void print(int cur){
for(int i=cur-1;i>=0;i--){
if(f[i]+num[cur]==f[cur]){
print(i);
printf(" %d",cur+1);
return;
}
}
printf("%d",cur+1);
}
int main(){
scanf("%d",&n);
memset(f,-1,sizeof(f));
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
for(int i=0;i<n;i++){
mapp[i][i]=0;
for(int j=i+1;j<n;j++){
scanf("%d",&mapp[i][j]);
}
}
int ans=-1;
int cur;
for(int i=0;i<n;i++){
int res=getd(i);
if(res>ans){
ans=res;
cur=i;
}
}
print(cur);
printf("\n%d",ans);
return 0;
}