2016 UESTC Training for Dynamic Programming P - 柱爷的矩阵 矩阵、递推
2016-05-17 12:25
465 查看
P - 柱爷的矩阵
Time Limit: 125/125MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Submit
Status
柱爷能干这么多大事,与他喜爱玩弄矩阵是分不开的。
有一天柱爷创造了一个NN行MM列的的矩阵A,因为一个个造数据太麻烦,所以柱爷只搞了第一列的数据Ai,1,1≤i≤NAi,1,1≤i≤N,其他数据由Ai,j=max(Ai,j−1−Bi,0),1≤i≤N,2≤j≤MAi,j=max(Ai,j−1−Bi,0),1≤i≤N,2≤j≤M 生成。
那么问题来了,柱爷想每行每列取不超过1个数,请问最大的和是多少。
Input
输入包括3行第一行 2个数N,MN,M
第二行 N个数Ai,1Ai,1
第三行 N个数BiBi
数据保证:
1≤M≤N≤10001≤M≤N≤1000
1≤Ai,1≤1061≤Ai,1≤106
1≤Bi≤Ai,11≤Bi≤Ai,1
Output
输出一个数,即答案
Sample input and output
Sample Input | Sample Output |
---|---|
2 1 6 8 1 5 | 8 |
4 3 5 9 10 3 1 6 7 3 | 16 |
Hint
对于样例2矩阵A为
5 4
3
9
30
103 0
3 0 0
10+3+3=16
Source
2016 UESTC Training for Dynamic Programming
My Solution
首先,对于每一行数字,B[i]越大数值减小越快如果取第i行和第j行的数字,且B[i]>B[j],那么一定先取第i行。
所以先按照B[i]降序排序。
dp[i][j] 表示取了第i列第j行数字时的最优解
dp[i][j] = maxdpi_1[i-1][j-1] + max(0, val[i].a - (j-1)*val[i].b);
maxdpi_1[i][j] = max(maxdpi_1[i-1][j], dp[i][j]);
ans = {maxdpi_1};
复杂度 O(M*N);
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1000 + 8; int dp[maxn][maxn], maxdpi_1[maxn][maxn]; struct ab{ int a, b; } val[maxn]; bool cmp(const ab& x, const ab& y) { return x.b > y.b; } int main() { #ifdef LOCAL freopen("a.txt", "r", stdin); #endif // LOCAL int N, M, ans = 0; scanf("%d%d", &N, &M); for(int i = 1; i <= N; i++) scanf("%d", &val[i].a); for(int i = 1; i <= N; i++) scanf("%d", &val[i].b); sort(val + 1, val + N + 1, cmp); for(int j = 1; j <= M; j++){ for(int i = 1; i <= N; i++){ dp[i][j] = maxdpi_1[i-1][j-1] + max(0, val[i].a - (j-1)*val[i].b); maxdpi_1[i][j] = max(maxdpi_1[i-1][j], dp[i][j]); } } for(int j = 1; j <= M; j++) ans = max(ans, maxdpi_1 [j]); printf("%d", ans); return 0; }
Thank you!
------from ProLights
相关文章推荐
- 2016 UESTC Training for Dynamic Programming N - 柱爷与子序列 这题和N题有些相似之处、用了树状数组
- 2016 UESTC Training for Dynamic Programming M - 柱爷抢银行欢庆5.1special 递推
- pdo中query()与prepare().execute()
- 2016 UESTC Training for Dynamic Programming L - 柱爷抢银行MkⅣ dp 线段树优化
- pdo中bindParam()与bindValue的区别
- OnGUI的视觉化编辑
- 2016 UESTC Training for Dynamic Programming J - 柱爷抢银行II dp单调队列优化
- LeetCode 298. Binary Tree Longest Consecutive Sequence
- 2016 UESTC Training for Dynamic Programming H - 柱爷大战滑稽王 LCS转LIS
- 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
- 2016 UESTC Training for Dynamic Programming D - 柱爷的恋爱 区间dp、记忆化搜索
- 2016 UESTC Training for Dynamic Programming C - 柱爷的下凡 预处理打表、背包问题
- 2016 UESTC Training for Dynamic Programming B - 柱爷与最大区间和 最大区间和推广、前缀和、枚举间隔点
- 2016 UESTC Training for Dynamic Programming A - 柱爷与咸鱼神功 0-1背包
- 【Leetcode】之Unique Paths
- Modular Query
- warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for re
- 关于RDLC子报表添加参数 错误“本地报表处理期间出错 。值不能为空。 参数名:value” 错误解决方法
- jsp trimDirectiveWhitespaces ="true"(删除空白行)
- Codeforces Round #353 (Div. 2) A. Infinite Sequence 水题