zstu2552 馬棚問題 DP

2022-05-15 02:27:28 字數 1166 閱讀 3468

動態規劃基本步驟(本人覺得):

1.確定陣列的維數,一維,二維等等;2.弄清陣列下標的含義3.找出狀態轉移方程式;4實現自己的想法;

本題思路:

二維陣列dp[i][j],i表示前i個馬棚放馬完畢,j表示佇列前j匹馬已經進入馬棚,dp[i][j]記錄前j匹馬放在前i個馬棚裡的最小不愉快係數,用f(a,b)表示只把第a匹馬到第b匹馬放在乙個馬棚裡的不愉快係數;

思考得出 狀態轉移方程:dp[i][j]=min(dp[i-1][t]+f(t,j));注意範圍:(i-1<=t範圍得出的理由:每個馬棚都至少要放一匹馬;

用zero[j],one[j]兩個陣列記錄前j匹馬中黑白馬的個數;

則不難得出   f(a,b)=(zero[b]-zero[a])*(one[b]-one[a]);

view code

#includeint dp[501][501],zero[501],one[501

];int

main()

else

}dp[

1][1]=0

;

for(j=2;j<=n-k+1;j++)

dp[1][j]=one[j]*zero[j];

for(i=2;i<=k;i++)

dp[i][j]=min;}}

printf(

"%d\n

",dp[k][n]);

}return0;

}

做完一道題後,再看看別人的做法,發現可以用一維陣列,結果又寫了個一維陣列,思想是完全一樣的,

只是用了dp[j],省去i;

理由:在遞推過程中有些資料用一次就沒什麼用了,用了一維陣列正是用了這個規律,

自己打個二維的dp[i][j],模擬一下計算過程就知道為什麼可以用一維陣列了;

view code

#includeint zero[550],one[550

];int dp[505

];int

main()

else

}for(j=1;j<=n;++j)

for(i=2;i<=k;i++)

dp[j]=min;}}

printf(

"%d\n

",dp[n]);

}return0;

}

ZSTU4247 萌新的旅行

time limit 1 sec memory limit 128 mb submit 488 solved 57 zstu的萌新們準備去自助旅行,他們租了一輛吉普車,然後選擇了n個城市作為遊覽地點。然後他們驚喜的發現他們選擇的城市剛好繞城乙個環。也就是說如果給所有城市按照0,1,2,n 1編號,0...

ZSTU校賽Problem H 玩具(尺取)

time limit 1 sec memory limit 128 mb submit 281 solved 70 商店有n個玩具,第 i個玩具有 a i 和快樂值 b i 有一天,小王來到商店想買一些玩具,商店老闆告訴他,如果他買的所有玩具的位置是連續的,那麼老闆答應小王購買的所有玩具中某乙個可以...

zstu 4014 水手分椰子 數學推導)

time limit 5 sec memory limit 64 mb submit 1827 solved 524 n個水手來到乙個島上,採了一堆椰子後,因為疲勞都睡著了。一段時間後,第乙個水手醒來,悄悄地將椰子等分成n份,多出乙個椰子,便給了旁邊的猴子,然後自己藏起乙份,再將剩下的椰子重新合在一...