[ CodeVS冲杯之路 ] P1048

本文介绍了一种使用区间动态规划解决合并代价最小化问题的方法。通过定义状态f[i][j]表示区间[i, j]内元素合并的最小代价,并采用前缀和优化求和过程,最终求得整个序列的最小合并代价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  不充钱,你怎么AC?

  题目:http://codevs.cn/problem/1048/

 

  区间DP题,设 f[i][j] 为在区间 [i,j] 中合并的最小代价

  

  目标状态是 f[1][n],末尾的求和公式可以用前缀和来优化

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define N 101
 8 using namespace std;
 9 
10 const int oo=(1<<31)-1;
11 int a[N],f[N][N],n,sum[N];
12 int main()
13 {
14     int i,j,k;
15     scanf("%d",&n);
16     for (i=1;i<=n;i++)
17     {
18         scanf("%d",&a[i]);
19         sum[i]=sum[i-1]+a[i];
20     }
21     for (k=1;k<n;k++)
22     {
23         for (i=1;i<=n-k;i++)
24         {
25             f[i][i+k]=oo;
26             for (j=i;j<i+k;j++) f[i][i+k]=min(f[i][i+k],f[i][j]+f[j+1][i+k]+sum[i+k]-sum[i-1]);
27         }
28     }
29     printf("%d\n",f[1][n]);
30     return 0;
31 }

 

转载于:https://www.cnblogs.com/hadilo/p/5868925.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值