挖地雷
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
在一個地圖上有n個地窖(n<=200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連接路徑,並規定路徑都是單向的,也不存在可以從一個地窖出發經過若干地窖後又回到原來地窖的路徑。某人可以從任一處開始挖地雷,然後沿着指出的連接往下挖(僅能選擇一條路徑),當無連接時挖地雷工作結束。設計一個挖地雷的方案,使他能挖到最多的地雷。(用動態規劃求解)
Input
輸入有多組數據,每組數據的第一行爲一個整數n,表示地窖的個數,第二行爲n個地窖中的地雷數。下面多行數據以0,0結束,每行爲兩個數x和y,表示從x可以到y。
Output
對於每組數據輸出兩行,第一行爲挖地雷的順序,第二行爲最多挖出的地雷數
Sample Input
1 6 5 10 20 5 4 5 1 2 1 4 2 4 3 4 4 5 4 6 5 6 0 0
Sample Output
3-4-5-6 34
思路分析:這是典型的DP題目,用一個數組來記錄通路,F來記錄最小路費,W來記錄錢,C來記錄路徑。
代碼:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { long f[201]={0},c[201]={0},w[201]; bool a[201][201]={0}; long t,i,j,x,k,max,y,n,l; cin>>t; while(t--) { memset(c,0,sizeof(c)); memset(f,0,sizeof(f)); memset(a,0,sizeof(a)); cin>>n; for(i=1;i<=n;i++) cin>>w[i]; do { cin>>x>>y; if(x!=0&&y!=0) a[x][y]=true; }while((x!=0)||(y!=0)); 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]=l+w[i]; c[i]=k; } k=1; for(j=2;j<=n;j++) if(f[j]>f[k]) k=j; max=f[k]; cout<<k; k=c[k]; while(k!=0) { cout<<"-"<<k; k=c[k]; } cout<<endl; cout<<max<<endl; } return 0; }