George and Job
来源:互联网 发布:弱矩阵 编辑:程序博客网 时间:2024/06/08 04:17
就是k组数,每组是连续的m个数,求这些数最大和。群里有人推荐这道题,于是来写了一下,题目意思还是很好理解的,很简单的动规思路。 连续m个数,那就对每一个位置都算出前m个数的和,然后就是取k次的一个背包。
dp[i][j]=max(dp[i][j-1],dp[i-1][j-m]+d[j]);
i代表取的次数,j代表到第j个数。但是初始化还有一点细节要处理。
#include<cstdio>#include<cstring>#include<iostream>using namespace std;int a[5005];long long dp[5005], dp1[5005][5005];long long max(long long a, long long b){return a > b ? a : b;}int main(){int i, j, m, n, ans, k;long long sum = 0, pre;cin >> n >> m >> k;for (i = 1; i <= n; i++)cin >> a[i];for (i = 0; i < m; i++){dp[i] = 0;sum = sum + a[i];}a[0] = 0; j = 0;for (i = m; i <= n; i++){sum = sum - a[j];sum = sum + a[i];dp[i] = sum;j++;}for (i = 0; i < m; i++)dp1[1][i] = 0;for (i = m; i <= n; i++)dp1[1][i] = max(dp1[1][i - 1], dp[i]);for (i = 2; i <= k; i++){for (j = i * m; j <= n; j++){dp1[i][j] = max(dp1[i][j - 1], dp1[i-1][j - m] + dp[j]);}}//for (i = 1; i <= n; i++)//cout << dp[i] << " ";//cout << endl;//for (i = 1; i <= k; i++)//{//for (j = 1; j <= n; j++)//cout << dp1[i][j] << " ";//cout << endl;//}cout << dp1[k][n] << endl;return 0;}
好久不写动规,这次感觉不错,得写专题了,模拟已经够了。
0 0
- cf467C George and Job
- C. George and Job
- George and Job
- codeforces467C George and Job dp
- 【CODEFORCES】 C. George and Job
- Codeforces 467C. George and Job
- 【DP】 467C George and Job
- Codeforces 467C George and Job
- codeforces 467C George and Job dp
- 【CF】 467C George and Job DP
- CF 267C George and Job
- Codeforces 467C George and Job(dp)
- codeforces 467C - George and Job
- codefores #267C George and Job(dp)
- CF 467C DP George and Job
- Codeforces 467 C. George and Job
- Codeforces 467C George and Job(dp)
- Codeforces 467C George and Job(dp)
- POJ 1947树形DP
- Leetcode 226 Invert Binary Tree
- sgu271:Book Pile(reverse大法好)
- Missing Ranges
- mysql 运维角度浅谈:MySQL数据库优化
- George and Job
- Uniform Generator
- 使用ScrollView实现下拉刷新(一)
- CODE[VS] 1214 线段覆盖
- POJ 1155 树形DP
- 黑马程序员_面向对象2
- java单例模式的讨论
- Android中常常使用shape来定义控件的一些显示属性
- Visual Studio 2012本身都是已经支持Jquery/Javascript智能提示