動態規劃基本步驟(本人覺得):
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份,多出乙個椰子,便給了旁邊的猴子,然後自己藏起乙份,再將剩下的椰子重新合在一...