博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1244 Max Sum Plus Plus Plus
阅读量:5224 次
发布时间:2019-06-14

本文共 1415 字,大约阅读时间需要 4 分钟。

虽然这道题看起来和 HDU 1024  Max Sum Plus Plus 看起来很像,可是感觉这道题比1024要简单一些

前面WA了几次,因为我开始把dp[22][maxn]写成dp[maxn][22]了,Orz

看来数组越界不一定会导致程序崩溃,也有可能返回一个错误的结果

 

dp[i][j]表示前j个数构成前i段所得到的最大值

状态转移方程:

dp[i][j] = max{dp[i][j-1],  dp[i-1][j-len[i]] + sum[j] - sum[j-len[i]]}

分别对应着不取第i个数和取第j个数及其之前相邻的共len[i]个数作为第i段加上之前的数构成i-1段构成的最大值

 

1 //#define LOCAL 2 #include 
3 #include
4 #include
5 using namespace std; 6 7 const int maxn = 1000 + 10; 8 int a[maxn], sum[maxn], len[22], dp[22][maxn]; 9 10 int main(void)11 {12 #ifdef LOCAL13 freopen("1244in.txt", "r", stdin);14 #endif15 16 int n, m;17 while(scanf("%d", &n) == 1 && n)18 {19 scanf("%d", &m);20 for(int i = 1; i <= m; ++i)21 scanf("%d", &len[i]);22 for(int i = 1; i <= n; ++i)23 scanf("%d", &a[i]);24 sum[0] = 0;25 for(int i = 1; i <= n; ++i)26 sum[i] = sum[i - 1] + a[i];27 memset(dp, 0, sizeof(dp));28 for(int i = 1; i <= m; ++i)29 {30 for(int j = 1; j < len[i]; ++j)31 dp[i][j] = dp[i][j-1];32 for(int j = len[i]; j <= n; ++j)33 dp[i][j] = max(dp[i][j-1], dp[i-1][j-len[i]] + sum[j] - sum[j-len[i]]);34 }35 printf("%d\n", dp[m][n]);36 }37 return 0;38 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3931550.html

你可能感兴趣的文章
201771010125王瑜《面向对象程序设计(Java)》第十三周学习总结
查看>>
手机验证码执行流程
查看>>
python 基础 ----- 变量
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
:hover 鼠标同时触发两个元素变化
查看>>
go语言学习十三 - 相等性
查看>>
Idea 提交代码到码云(提交到github也大同小异)
查看>>
c#连接excel2007未安装ISAM解决
查看>>
Mono 异步加载数据更新主线程
查看>>
初识lua
查看>>
我是插件狂人,jDuang,jValidator,jModal,jGallery
查看>>
张季跃 201771010139《面向对象程序设计(java)》第四周学习总结
查看>>
如何解除循环引用
查看>>
android中fragment的使用及与activity之间的通信
查看>>
字典【Tire 模板】
查看>>
jquery的contains方法
查看>>
python3--算法基础:二分查找/折半查找
查看>>
Perl IO:随机读写文件
查看>>
Perl IO:IO重定向
查看>>