题目大意:  值得注意的一点是题目要求的是这些子段之间的最大整数和。注意和Max Sum Plus Plus这个题目的区别。

题解:

线性区间DP,对每一段考虑取或者不取。定义状态dp[i][j]指的是前i个数分为j段。

如果第j段不选的话dp[i][j]=dp[i-1][j],直接就是上一个状态的值。

如果选得话,dp[i][j]=dp[i-part[j]][j-1]+sum[i]-sum[i-part[j]]。前一共有i个数,第j段要占用i-part[j]个数,所以前j-1段要占用

i-part[j]个数。然后取最好的状态就行了。复杂度O(n*m)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=+;
ll dp[N][N];
ll arr[N];
ll part[N];
ll sum[N];
int main(){
ll n;
while(cin>>n,n){
ll m;
cin>>m;
memset(dp,,sizeof dp);
memset(sum,,sizeof sum);
for(ll i=;i<=m;i++) cin>>part[i];
for(ll i=;i<=n;i++) cin>>arr[i];
for(ll i=;i<=n;i++) sum[i]=sum[i-]+arr[i];
for(ll i=;i<=n;i++)
for(ll j=;j<=m;j++){
if(part[j]>i) dp[i][j]=dp[i-][j];
else dp[i][j]=max(dp[i-][j],
dp[i-part[j]][j-]+sum[i]-sum[i-part[j]]);
}
cout<<dp[n][m]<<endl;
}
return ;
}

最新文章

  1. HDU1086You can Solve a Geometry Problem too(判断线段相交)
  2. 数据结构之二分查找(PHP)
  3. VS下的Resharper插件报错&ldquo;Can not resolve symbol&rdquo;的解决办法
  4. Dll学习二_Dll 窗体中动态创建数据并使用Demo
  5. bvp4c--语法
  6. 注解在android中的使用
  7. python3中字典的copy
  8. Badboy安装与使用
  9. android TextView实现滚动显示效果
  10. js实现导航菜单栏随着屏幕的滚动进行滚动的效果
  11. WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方
  12. getSystemService详解
  13. Aho-Corasick算法学习
  14. 利用GSEA对基因表达数据做富集分析
  15. day4——无重复字符的最长子串
  16. openssl rsa java 大于117的长字符串加密
  17. spring入门——applicationContext与BeanFactory的区别
  18. domino server端的Notes.ini详解
  19. Mac 安装任何来源的文件
  20. C语言中内存分配问题:

热门文章

  1. Leetcode_474. 一和零(二维01背包)
  2. CodeForces 196B Infinite Maze
  3. Transformers 简介(下)
  4. 在Ubuntu中安装OpenCV-Python | 三
  5. Mysql性能优化:如何给字符串加索引?
  6. coding++:Idea设置Java类注释模板和方法注释模板
  7. springboot系列(三)配置文件详解
  8. mybatis诡异的bug
  9. vulnhub~Djinn:2
  10. Vertica的这些事(四)——-vertica加密数据