例1.挖地雷
这是一道经典的题目,重要的是设状态。
我们设f[i]表示以第i个地窟开始挖地雷所能得到的最大效应,这是不难写出状态转移方程!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[1001],b[1001][1001],f[1001],p[1000001];
int main(){
int i,j,k,n,m;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
while(!feof(stdin)){
int x,y;
scanf("%d%d",&x,&y);
if(x==0 && y==0)break;
b[x][y]=1;
}
int ans=0;
for(i=n;i>=1;i--){
f[i]=a[i];
for(j=i+1;j<=n;j++)
if(b[i][j] && f[j]+a[i]>f[i]){
f[i]=a[i]+f[j];p[i]=j;
}
if(f[i]>f[ans])ans=i;
}
k=ans;
printf("%d",ans);ans=p[ans];
while(ans!=0){
printf("-%d",ans);
ans=p[ans];
}
printf("\n%d\n",f[k]);
return 0;
}