整理图书
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的是一个整体,不可分开,(可以想象架子是一条直线),但是这些书高度却参差不齐,小明有强迫症,看不得不整齐所以他想让这些书的高度形成一个非降序列他才舒心,可是这些书是有序的,所以他只能把其中的一摞书和他相邻的书装订在一起形成一摞新的书,那么他最少的装订次数是多少呢
分析:哎!做了很久,不知道自己的思路和代码哪里错了。后来,看了别人的题解,用了别人的思路才AC了,自己太菜!!!
思路:DP。
CODE:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main()
{
const int maxn=1005;
int n,cnt=0;
while(scanf("%d",&n)!=EOF){
int high[maxn],sum[maxn],hmax[maxn];
sum[0]=0,hmax[0]=0;
for(int i=1;i<=n;i++){
cin>>high[i];
sum[i]=sum[i-1]+high[i];
hmax[i]=max(high[i],hmax[i-1]);
}
int dp[maxn];
for(int i=0;i<maxn;i++)
dp[i]=1e6;
dp[0]=dp[1]=0;
for(int i=2;i<=n;i++)
for(int j=i-1;j>=0;j--)
if(hmax[j]<=sum[i]-sum[j]&&dp[i]>dp[j]+i-j-1){
dp[i]=dp[j]+i-j-1;
hmax[i]=sum[i]-sum[j];
break;
}
cnt++;
cout<<"Case "<<cnt<<": "<<dp[n]<<endl;
}
return 0;
}
附上一直未AC:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main()
{
int n,cnt=0;
while(scanf("%d",&n)!=EOF){
int high[1005],ans=0,sum=0;
memset(high,0,sizeof(high));
for(int i=0;i<n;i++)
cin>>high[i];
for(int i=1;i<n;i++){
sum+=high[i];
if(sum>=high[i-1]){
high[i]=sum;
sum=0;
}
else if(sum+high[i-1]<=high[i+1]){
high[i]=sum+high[i-1];
sum=0;
ans++;
}
else{
high[i]=high[i-1];
ans++;
}
}
cnt++;
cout<<"Case "<<cnt<<": "<<ans<<endl;
}
return 0;
}