目錄dp二:使用一維陣列
在一條公路上埋有若干堆地雷,每堆地雷有一定的數量,地雷堆的編號為1,2,…,n,例如,埋有地雷數量如下:8 14 2 17 33 26 15 17 19 6此時,地雷的數量可用一維陣列a(n)表示。同時,給出地雷堆之間的聯絡,從第1堆開始,它指出挖了此堆之後,還可以選擇繼續往下挖,若存在多種方案,只能選擇其中的一種,若沒有任何後繼的方案,則挖地雷結束。例如,可給出下面的關係:地雷堆之間的聯絡可用以下的陣列表示:
二維整數型陣列r(i,j)表示,當r(i,j)=1表示從i到j有通路,當r(i,j)=0表示無通路。上圖的r如下所示:
最終,找出可以挖到地雷的最大值
其實剛開始看到這個地雷圖就想到了dag問題。下面就用動態規劃求解這個問題。對於第i堆地雷來說,選擇能夠挖最多的那條路徑,就是下面這個遞推公式。dp[i][j]表示i到j上的最大值,但是只有通過和i相連的那些路徑才能夠通向更遠。因為是單向圖,所以在這裡,填表要從下向上填表。dp[i][j]=a[i]+max
/**
* 求最大地雷數
* @param a ai表示第i堆的地雷個數
* @param r r(i,j)表示i和j之間是否存在通路
*/public static void getmax(inta,intr) }}
}} //找到表中的最大值
思想與上面類似,dp[i]表示第i堆向後最多能挖的地雷數,dp[i]=a[i]+max遞迴出口(填表初值):dp[n]=a[n]
/**
* 求最大地雷數
* @param a ai表示第i堆的地雷個數
* @param r r(i,j)表示i和j之間是否存在通路
*/public static void getmax2(inta,intr) }}
dp[i]=maxinm+a[i];
path[i]=maxindexinm;
if(dp[i]>max)
} //輸出最優解
while(maxindex!=-1)
system.out.println("最多挖到"+max+"堆雷");
挖地雷問題
問題描述 在乙個地圖上有n個地窖 n 20 每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。如圖3 圖3當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖 僅能選擇一條路徑 當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使某人能挖到最多的地雷。輸入檔...
挖地雷問題 DP
挖地雷問題 p3.pas c cpp 問題描述 在乙個地圖上有n個地窖 n 20 每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。如圖3 圖3當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖 僅能選擇一條路徑 當無連線時挖地雷工作結束。設計乙個挖地雷...
例9 6 挖地雷
時間限制 1000 ms 記憶體限制 65536 kb 在乙個地圖上有n個地窖 n 200 每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑,並規定路徑都是單向的,且保證都是小序號地窖指向在序號地窖,也不存在可以從乙個地窖出發經過若干地窖後又回到原來地窖的路徑。某人可以從任一處開始挖地雷,...