CDOJ 1347柱爷的矩阵(二维dp)
来源:互联网 发布:sql server如何下载 编辑:程序博客网 时间:2024/05/29 16:33
柱爷的矩阵
Time Limit: 125/125MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
柱爷能干这么多大事,与他喜爱玩弄矩阵是分不开的。
有一天柱爷创造了一个
那么问题来了,柱爷想每行每列取不超过1个数,请问最大的和是多少。
Input
输入包括3行
第一行 2个数
第二行 N个数
第三行 N个数
数据保证:
1≤M≤N≤1000 1≤M≤N≤10001≤Ai,1≤106 1≤Ai,1≤1061≤Bi≤Ai,1 1≤Bi≤Ai,1
Output
输出一个数,即答案
Sample input and output
2 16 8 1 5
8
4 35 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
题解:涉及到一个二维矩阵内数字的选择问题,我们第一个想到的就是dp,没错,这就是一个二维dp,但是也是有技巧的,首先通过观察矩阵的生成式,我们可以看到每一行是一个等差序列,根据选数字的规则,对于每一行我们可以选一个或者不选,每一列可以选一个或者不选,这样一来很容易想到,我们应该优先选下降的快的,这是可证的。因此我们先对第一列安装想下降顺序对其进行排列。
因此我们可以得到一个dp方程,设dp[i][j]为选了第i行第j列之后得到的最优解,mx[i][j]为考虑到第i行第j列(即选或不选)的最优解
得到状态转移方程
dp[i][j]=mx[i-1][j-1]+max(0,(i-1)*b[j]);
mx[i][j]=max(dp[i][j],dp[i][j-1])
代码如下
#include <iostream>#include <bits/stdc++.h>using namespace std;int dp[1005][1005];int mx[1005][1005];struct node{ int a; int b;}nod[1005];bool cmp(node a,node b){ return a.b>b.b;}int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&nod[i].a); for(int i=1;i<=n;i++) scanf("%d",&nod[i].b); sort(nod+1,nod+1+n,cmp); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++){ dp[i][j]=mx[i-1][j-1]+max(0,nod[j].a-(i-1)*nod[j].b); mx[i][j]=max(dp[i][j],mx[i][j-1]); } } int ans=0; for(int i=1;i<=m;i++) ans=max(ans,mx[i][n]); cout<<ans<<endl; //cout << "Hello world!" << endl; return 0;}
0 0
- CDOJ 1347柱爷的矩阵(二维dp)
- CDOJ 1321柱爷的恋爱 (区间dp)
- 【cdoj 1323】柱爷的下凡 dp打表预处理
- cdoj柱爷的下凡
- 【cdoj 1321】柱爷的恋爱 区间dp记忆化搜索
- CDOJ 1357 柱爷与最大区间和(dp+滚动数组)
- CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)
- CDOJ 1349 柱爷大战滑稽王(dp LCS转LIS)
- 【CDOJ 1323】柱爷的下凡
- 【CDOJ 1321】柱爷的恋爱
- NYOJ 104 最大子矩阵(二维DP)
- 【矩阵二维或三维dp】最大子矩阵,子矩阵快速求和(用到最大直方图)
- matlab-线性代数 矩阵的合成(二维)
- 二维矩阵的乘法
- 【cdoj 1335】柱爷与三叉戟不得不说的故事 状压dp+子集枚举
- 【CDOJ 1355】柱爷与三叉戟不得不说的故事 【状压DP+子集枚举】
- CDOJ 1330 柱爷与远古法阵 概率DP,高斯消元,卡精度,极度恶心
- cdoj 1354 柱爷很忙
- Unicode转义(\uXXXX)的编码和解码
- fedora 设置中文输入,
- 走进缓存的世界(三)
- 数据库进阶之路(五)
- 简单归并排序
- CDOJ 1347柱爷的矩阵(二维dp)
- 阿里巴巴最新开源项目
- [深入JUnit] 测试运行的入口
- JAVA NIO学习笔记1
- 平均分布的一些问题
- Java获取文件路径的几种方法
- struts2的核心和工作原理
- Windows用tomcat搭建应用服务器
- Java数组工具类之Arrays