ACM PKU 1695 Magazine Delivery 三維動態規劃
http://acm.pku.edu.cn/JudgeOnline/problem?id=1695第一次做三位動態規劃,看了謝迪的《淺談動態規劃》,寫出如下程序


































































本地調試成功,不過提交上去總是wa,郁悶了我一個多小時了.
唉..
不過總算是自己做了一次三維動態規劃了.希望哪個牛人可以告訴我這個程序哪里出問題了.
假設i,j<k
f[i][j][k-1]表示狀態: 三個車分別在i,j,k-1的位置
狀態轉移有三個,要么是從某車i開到k ,要么是j開到k,要么是k-1開到k(遞推方式,每次加1)
所以狀態轉移方程是:
f[i][j][k-1]+d[i][k] -> f[j][k-1][k]
f[i][j][k-1]+d[j][k] -> f[i][k-1][k]
f[i][j][k-1]+d[k-1][k] -> f[i][k-1][k]
這是3維動態規劃的基本模型
唉,不知道怎么過不去啊~
你要是有興趣就幫忙測試一下吧~ 呵呵
回復 更多評論
你第三個if語句錯了,
if(f[i][j][k-1]+d[k-1][k]<f[i][k-1][k])
f[i][j][k]=f[i][j][k-1]+d[k-1][k];
應該是
if(f[i][j][k-1]+d[k-1][k]<f[i][j][k])
f[i][j][j]=f[i][j][k-1]+d[k-1][k];
還有就是你三個if語句都只寫了一半.只要細想一下就會發現
f[i][j][k]其實應該是等于f[j][i][k]的,
所以每個if語句中都要再加上一條賦值語句.
我幫你改了下,AC了.修改如下.
f[1][1][1]=0;
for(k=2;k<=n;k++)
for(i=1;i<k;i++)
for(j=1;j<k;j++)
{
if(f[i][j][k-1]+d[i][k]<f[j][k-1][k])
{
f[j][k-1][k]=f[i][j][k-1]+d[i][k];
f[k-1][j][k]=f[i][j][k-1]+d[i][k];
}
if(f[i][j][k-1]+d[j][k]<f[i][k-1][k])
{
f[i][k-1][k]=f[i][j][k-1]+d[j][k];
f[k-1][i][k]=f[i][j][k-1]+d[j][k];
}
if(f[i][j][k-1]+d[k-1][k]<f[i][j][k])
{ f[i][j][k]=f[i][j][k-1]+d[k-1][k]; f[j][i][k]=f[i][j][k-1]+d[k-1][k];
}
}
回復 更多評論
呵呵!感謝! 原來是這么細微的問題! 暈哦
謝謝哈
另外,你說的第二個問題是不存在的,我也考慮到你說的問題;因為你仍然用的
for(k=2;k<=n;k++)
for(i=1;i<k;i++)
for(j=1;j<k;j++)
仍然是完全窮舉
時間效率上沒有任何改進,反而因為重復計算降低了效率。
其實可以這樣改,會提高一點點效率:
for(k=2;k<=n;k++)
for(i=1;i<k;i++)
for(j=i;i<k;j++)
回復 更多評論
這個雖然ac 但是還不對
應該需要先算一遍任意兩點間的最短距離
考慮下面這種情況:
從(1,2,3)-》(1,3,4)
那么從2開到4可以走的最短路并不一定是從2直接到4,你可以從2-》3-》4
給你一個例子:
1
4
2 5 6
2 2
8
你的算出來是9 但其實應該是8
所以要么先算一遍最短路 要么把狀態考慮全 比如要算(1,2,2)這種狀態 回復 更多評論
只有注冊用戶登錄后才能發表評論。 | ||
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
![]() |
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|