ACM Word Clouds Revisited 题解

来源:互联网 发布:淘宝固本安宫止血汤 编辑:程序博客网 时间:2024/06/03 19:07




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;}}



原创粉丝点击