题目大意,给若干方块,让把方块拍成若干行,使得最终高度最小。其中,每行有宽度限制,高度为每行中最高的箱子的高度。
于是,很直观的认为,这个题可能也许大概应该是个动态规划的题。
于是,设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; }