題目:
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]])記錄路徑1***if(t1==0
)
}
int tmp=mk;記錄路徑1配套輸出for(int j=m;j>0;j--)
sort(ans+1,ans+m+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...