N在(0,1001)
K在(0,11)
每片树叶的重量(0,1001)
前缀和优化一下即可
还要注意一下叶子们的顺序
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define M 1001 5 #define ll long long 6 using namespace std; 7 int n,K; 8 int h[M]; 9 ll pre[M];//前缀和 10 ll sum[M][M];//表示把1-i的叶子搞到j的费用 11 ll dp[M][11];//表示前i堆叶子分了j段的最小费用 12 int main() 13 { 14 scanf("%d%d",&n,&K); 15 for(int i=1;i<=n;i++) scanf("%d",&h[i]); 16 for(int i=1;i<=n/2;i++) swap(h[i],h[n-i+1]); 17 for(int i=1;i<=n;i++) pre[i]=pre[i-1]+h[i]; 18 for(int i=1;i<=n;i++) 19 for(int j=i;j<=n;j++) 20 { 21 if(i==j) sum[i][j]=sum[i-1][j-1]+pre[i-1]; 22 else sum[i][j]=sum[i][j-1]+pre[i]; 23 } 24 memset(dp,0x7f,sizeof(dp)); 25 for(int i=1;i<=n;i++) 26 { 27 dp[i][1]=sum[i][i]; 28 for(int j=1;j<i;j++) 29 for(int k=2;k<=min(K,j+1);k++) 30 dp[i][k]=min(dp[i][k],dp[j][k-1]+sum[i][i]-sum[j][i]); 31 } 32 printf("%lld",dp[n][K]); 33 return 0; 34 }
原文:https://www.cnblogs.com/Slrslr/p/9575473.html