刷表法动态规划:HOJ11391_Word Clouds Revisited

题目大意,给若干方块,让把方块拍成若干行,使得最终高度最小。其中,每行有宽度限制,高度为每行中最高的箱子的高度。

于是,很直观的认为,这个题可能也许大概应该是个动态规划的题。

于是,设DP[K]为K及K以后的所有箱子组成的集合,以K为开头的最小值。

于是可以对这个状态进行状态转移,最终输出DP[0]为答案。

 

AC代码如下:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<vector>
#include<string.h>
#include<string>
#include<set>
#include<queue>
#include<map>
#include<algorithm>

using namespace std;
const long long MAXN=5233;
const long long INF=1e9+233;

long long dp[MAXN];
pair<long long ,long long> p[MAXN];
long long n,c;


void init()
{
    cin>>n>>c;
    for(int i=0;i<n;++i)
    {
        cin>>p[i].second>>p[i].first;
        dp[i]=0;
    }
    for(int i=n-1;i>=0;--i)
    {
        dp[i]=INF;long long ans=0;
        long long wid=0;
        for(int j=i;j<n;++j)
        {
                if(wid+p[j].second<=c)
                {
                    ans=max(ans,p[j].first);
                    dp[i]=min(ans+dp[j+1],dp[i]);
                    wid+=p[j].second;
                }else break;
        }
    }    
    cout<<dp[0]<<endl;
}



int main()
{
    cin.sync_with_stdio(false);
    init();
    
    return 0;
}

 

posted @ 2017-09-08 17:50  六花的邪王真眼  阅读(202)  评论(0编辑  收藏  举报