poj1015陪審團 DP 路徑記錄

2022-05-12 13:19:36 字數 1569 閱讀 3330

題目:

dp的第一維是選了幾個人,第二維是當前d與p的差值,而值存的是當前d與p的和;

技巧1:通過平移避免負角標,即**中的fix;

技巧2:做完dp後找出最小的差的絕對值時,如下的那一小段**很有效率;

技巧3(*):記錄路徑——①更新路徑時每次判斷是否重複選了乙個人,重複則不更新;

if(f[j][k]+p[i]+d[i]>f[j+1][k+p[i]-d[i]])

if(t1==0

)

}

記錄路徑1***

int tmp=mk;

for(int j=m;j>0;j--)

sort(ans+1,ans+m+1);

記錄路徑1配套輸出

②使用vector,每次更新暴力複製;(下面採用)

if(dp[i+1][j+subtraction[k]] <= dp[i][j] +_plus[k])  

記錄路徑2***

注意:(不知為何)dp順序,必須是i+1被i更新,原來寫的是i被i-1更新,一直wa。

**如下:

#include#include

#include

#include

#include

using

namespace

std;

int n,m,a[205],b[205],f[25][805],fix,t,ans[205

];vector

pre[25][805

];int

main()

if(f[j][k] >= 0

)

} }

intmk;

//for(int k=fix;k<=2*fix;k++)

//if(f[m][k]>0)

////

for(int k=fix;k>=0;k--)

////

}int j=0

;

while(f[m][fix-j]<0&&f[m][fix+j]<0)j++;

if(f[m][fix-j]>f[m][fix+j])mk=fix-j;

else mk=fix+j;

int d=(f[m][mk]+(mk-fix))/2

;

int p=(f[m][mk]-(mk-fix))/2;//

int tmp=mk;

//for(int j=m;j>0;j--)

////

sort(ans+1,ans+m+1);

printf("

jury #%d\nbest jury has value %d for prosecution and value %d for defence:\n

",t,d,p);

for(int i=0;i)

printf("%d

",pre[m][mk][i]);

printf(

"\n\n");}}

POJ 1015 陪審團人選 動態規劃

用f i j 表示,取i個候選人,使其辯控差為j 的所有方案中,辯控和最大的那個方案的控辯和。要求f i j 顯然要從乙個可行的方案 f i 1 x 演化而來。可行方案f i 1,x 能演化成方案f j,k 的必要條件是 存在某個候選人k,k 在方案f i 1,x 中沒有被選上,且x v k j v...

poj 1015 動態規劃 難

這道題我是看別人的思路寫的,因為有個絕對值,無法轉移狀態,自己傻得非要把絕對值表示出來,其實可以在計算完成後篩選,我這個菜鳥估計是受揹包的的影響,想狀態的時候還想著前幾個中選出多少個。這道題的狀態是f i j i選了的人數,邊界為零,目標為m,j為d p a 的差值和,f值為d p b 值。記如何狀...

經典動態規劃題目 POJ 1015

在文章開始時,先宣告一下,小弟剛開始接觸acm,水平有限,所以這裡給出的程式是閹割版的,只實現了關鍵功能,無法ac 這道題類似於經典的陣列分割問題,可參見 程式設計之美 2.18 include include const int max n 202 const int max m 22 const...