名字是模仿的HYC小牛 ......
題目確實很無語:
巧克力
【問題描述】
現在,你有一個n*m的巧克力塊,
你要把它們切成1*1的小塊。每次你可以豎直的切或者水平的切,每切一次都有一定的費用。並且,當你把一大塊巧克力切成兩部分後,你在第一部分如何切不會切到第二部分。比如先全部水平切,再豎直切,費用是
(y1+y2+y3)+4*(x1+x2+x3+x4+x5)
【輸入格式】
第一行兩個數n,m
接下來一行,n-1個數,表示yi
接下來一行,m-1個數,表示xi
【輸出格式】
輸出一個數,表示把巧克力切成1*1的小塊用的最少費用
【樣例輸入】
2 3
2
1 3
【樣例輸出】
9
【數據說明】
30%:n,m,xi,yi <=100
70%: n,m,xi,yi <=100000
100%:n,m,xi,yi<=500000
我想了一個n*K的動規:設f[i][j]爲在與Y軸平行的方向切了i刀,在與X軸平行的方向切了j刀的最小代價,則有f[i][j]=min{f[i-1][j]+x[i]*(j+1),f[i][j-1]+y[j]*(i+1) | 0≤i≤m-1,0≤j≤n-1},f[0][0]=0。稍微分析一下這個DP:每次都是單純的代價相加得到總代價,所以,一般地,每一次的最優值都是由前一次的的最優值得到,符合最優子結構性質。並且,對於每一個狀態下一步該如何進行操作,與前面的得分和操作無關,滿足無後效性。既滿足了最優子結構性質又滿足無後效性,似乎本題就這樣解決了,
將兩個序列分別按權值排成降序,這個序列就是我們需要的最優序列。
n*k看了看範圍怎麼都會超......
正解如下(勿噴):
將所有的數據排序,然後從小到大模擬......(就這樣,真的就這樣......)
老規矩,貼代碼: