DP题,先打一个从i 到 j 的maxh 的表book【i】【j】, 再用一维DP。 注意 5000*5000的数组开不下, 但可以开一半(i<=j), 用vector 。
好吧,其实没必要这么复杂。。。。
一位大佬:直接DP就可以了
我: 好像是这样。。。
对, 开出来的book【i】【j】中的值都只用了一遍, 就没有打表的意义了, 直接在DP中求, 还可以简化。
#include<bits/stdc++.h>
using namespace std;
vector<int> book[5005];
int main(){
int n,c,i,j,k,maxh,sumw;
int w[5005],h[5005],dp[5005];
for(i=0;i<5005;i++)
{
book[i].clear();
j=5005-i;
book[i].resize(j);
}
while(cin>>n>>c){
for(i=0;i<5005;i++)
{
j=5005-i;
for(k=0;k<j;k++)
{
book[i][k]=-1;
}
}
for(i=0; i<=n;i++)
dp[i] = 99999999;
for(i=1; i<=n; i++){
cin>>w[i]>>h[i];
}
for(i=1; i<=n; i++){
maxh = 0;
sumw = 0;
for(j=i; j<=n; j++){
sumw += w[j];
if(sumw > c) break;
maxh = max(maxh, h[j]);
book[i][j-i] = maxh;
}
}
dp[0] = 0;
for(i=1; i<=n; i++){
for(j=i-1; j>=0; j--){
if(book[j+1][i-j-1] == -1) break;
dp[i] = min(dp[i], dp[j]+book[j+1][i-j-1]);
}
}
cout<<dp[n]<<endl;
}
}