E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)
2024-08-27 13:29:09
题目大意: 值得注意的一点是题目要求的是这些子段之间的最大整数和。注意和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 ;
}
最新文章
- HDU1086You can Solve a Geometry Problem too(判断线段相交)
- 数据结构之二分查找(PHP)
- VS下的Resharper插件报错&ldquo;Can not resolve symbol&rdquo;的解决办法
- Dll学习二_Dll 窗体中动态创建数据并使用Demo
- bvp4c--语法
- 注解在android中的使用
- python3中字典的copy
- Badboy安装与使用
- android TextView实现滚动显示效果
- js实现导航菜单栏随着屏幕的滚动进行滚动的效果
- WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方
- getSystemService详解
- Aho-Corasick算法学习
- 利用GSEA对基因表达数据做富集分析
- day4——无重复字符的最长子串
- openssl rsa java 大于117的长字符串加密
- spring入门——applicationContext与BeanFactory的区别
- domino server端的Notes.ini详解
- Mac 安装任何来源的文件
- C语言中内存分配问题: