#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int n,l,r;
int a[N],dp[N][N][N],sum[N];
int main(){
while(scanf("%d%d%d",&n,&l,&r)!=EOF){
for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
memset(dp,0x3f,sizeof dp);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
dp[j][i][i-j+1]=0;
}
}
int L=l,R=r;
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int l=i,r=i+len-1;
for(int j=l;j+1<=r;j++){
for(int k=2;k<=len;k++){
dp[l][r][k]=min(dp[l][r][k],dp[l][j][k-1]+dp[j+1][r][1]);
}
}
for(int k=L;k<=R;k++){
dp[l][r][1]=min(dp[l][r][1],dp[l][r][k]+sum[r]-sum[l-1]);
}
}
}
if(dp[1][n][1]>1e9) cout<<0<<endl;
else cout<<dp[1][n][1]<<endl;
}
}
2017 北京赛区 J题 Pangu and Stones(区间dp
最新推荐文章于 2022-05-22 14:43:32 发布
该博客主要探讨了一种动态规划方法,用于解决给定数组中,区间子数组的最小和问题。程序首先读取输入的数组长度n、左边界l和右边界r,然后利用动态规划技巧填充dp数组,以找到满足条件的子数组的最小和。最后,当dp[1][n][1]大于预设阈值时,输出0,否则输出最小和。
摘要由CSDN通过智能技术生成