Towers
题意:获得连续高度呈非递减状态的序列,相邻塔高可合并,每合并一次代表一次操作,求出能得到该种序列的最小操作次数
思路:刚开始想用贪心,后来发现总是有情况没办法考虑到,wa了多次,后来经指点再次体会动态规划的魅力。第二次在需要动态规划时病急投医想到贪心,无药可救
dp{i]表示考虑到第i个塔时的操作次数,再用一个数组sum[i]表示前i个塔高的总和,便于从sum[i]-sum[j]获取相邻任意数量的塔高,DP大法好
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int dp[5010];
int a[5010];
int sum[5010];
int main(){
int x;
while(scanf("%d",&x)!=EOF){
int i,j;
a[0]=0;
sum[0]=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=x;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(i=1;i<=x;i++){
for(j=i-1;j>=0;j--){
if(sum[i]-sum[j]>=a[j]){
a[i]=sum[i]-sum[j];
dp[i]=dp[j]+i-j-1;
break;
}
}
}
printf("%d\n",dp[x]);
}
}