練習賽6.2.挖地雷

挖地雷

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;
}
發佈了41 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章