您的位置:首页 > 产品设计 > UI/UE

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 InputSample 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
3
0
10
3 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐