第三章總結
在一個地圖上有n個地窖(n≤200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑,並規定路徑都是單向的,且保證都是小序號地窖指向大序號地窖,也不存在可以從一個地窖出發經過若干地窖後又回到原來地窖的路徑。某人可以從任意一處開始挖地雷,然後沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計一個挖地雷的方案,使他能挖到最多的地雷。
1.程式碼:
#include<iostream>
#include<cstring>
#define MAXN 200
using namespace std;
bool a[MAXN][MAXN];//a[i][j]表示第i個地窖和第j個地窖是否是通路
int w[MAXN];//每個地窖的地雷數
int f[MAXN];//f[i]表示從第i個地窖開始挖的最多地雷數
int suf[MAXN];
int main()
{
memset(a,0,sizeof(a));
memset(w,0,sizeof(w));
memset(f,0,sizeof(f));
long n,i,j,x,y,l,k,maxn;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>w[i];
}
while(cin>>x>>y)
{
if(x==0&&y==0) break;
a[x][y]=true;
}
f[n]=w[n];//初始狀態
for(i=n-1;i>=1;i--)
{
l=0,k=0;
for(j=i+1;j<=n;j++)
{
if((a[i][j])&&f[j]>l)
{
l=f[j];
k=j;
}
}
f[i]=w[i]+l;
suf[i]=k;
}
k=1;
for(i=1;i<=n;i++)//從n個數中找最大值
{
if(f[i]>f[k]) k=i;
}
maxn=f[k];
cout<<k;//先輸出起始點
k=suf[k];
while(k!=0)//向後的連結串列
{
cout<<"-"<<k;
k=suf[k];
}
cout<<endl;
cout<<maxn<<endl;
return 0;
}
2.本題的遞迴方程應為 dp[i]=dp[j]+a[i]。
3.填表順序為從左到右。