poj 1015 動態規劃 難

2021-06-25 09:37:28 字數 1114 閱讀 5687

這道題我是看別人的思路寫的,因為有個絕對值,無法轉移狀態,自己傻得非要把絕對值表示出來,

其實可以在計算完成後篩選,我這個菜鳥估計是受揹包的的影響,想狀態的時候還想著前幾個中選出多少個。

這道題的狀態是f[i][j],i選了的人數,邊界為零,目標為m,j為d-p(a)的差值和,f值為d+p(b)值。記如何狀態轉移呢,

f[i][j]是由f[i-1][x]而來,而x+a[k]=j;要求k沒有被用到,因此用path[i][j]表示該狀態時,最後乙個選著的編號,前面的用

到的編號可以通過path[i-1][j-a[path[i][j]]得到,由此判斷k是否可用。而且,由於j值可能為負,因此加上乙個可能取值的最大值,

這兒為400,邊界為f[0][0+400]=0,在遞推的時候,如果j為負或大於2*400,都是不合法的。ps:這道題我除錯了乙個下午

,居然是陣列開的太小,結果以為開的很大,結果出現完全沒解釋的奇怪現象卻不報錯。

/*poj 1015

*/#include #include using namespace std;

#define m 25

#define n 10000

#define move 400

#define min -9999999

int f[m+10][n],path[m+10][n],a[n],b[n];

int n,m;

int main(int argc, char const *argv)

y=y-a[path[v][y]];

v--;

}if(sig==1)

}printf("jury #%d\n",h );

printf("best jury has value %d for prosecution and value %d for defence: \n",

(z+f[m][z+move])/2,(z+f[m][z+move])/2-z );

int g[m];

int l=0;

fill(g,g+m,999999999);

int j=z+move;

int i=m;

while(i)

sort(g,g+m);

for(int i=0;i

經典動態規劃題目 POJ 1015

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

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...

POJ1015和uva323動態規劃01揹包擴充套件

題解 一開始以為這個符合最優子結構的動態規劃,但是後來看了別人的題解發現不符合最優子結構,無法將所有的狀態轉移。因為可能我選了前面這個但是如果我選另外乙個加上本身更優,這個時候選擇沒辦法選擇另外乙個因為已經消失了,這個時候可以用01揹包的思想做並且用乙個vector陣列記錄一下路徑,用陣列第二維20...