前k大金币(动态规划,递推)



/*
///题解写的很认真,如果您觉得还行的话可以顶一下或者评论一下吗?
思路:
这题复杂在要取前k大的结果,如果只是取最大情况下的金币和,直接
动态规划递归就可以,可是前k大并不能找出什么公式,所以在二元数组的基础上再并上一个vector 首先:初始化最左边和最上边(动态规划的边缘)
其次:找出关系,每个格的金币只可能来自上边或者右边(动态规划的状态方程)
然后:我们要找的是前k大金币总和而不是前1大,所以准备vector存更多情况
然后:每次处理时,当前格子除了拿上自己的金币外,还要接受前面或者上边送来
的一袋袋金币这些金币,这些袋子有大有小,尽可能挑出前k大的袋子(如果没有
k那么多就全部挑出来),然后当前格子最多接受k+k袋金币(上面的k和左边的k)
接受时边接受边排序,那么下次当前格子附近的格子要调用这个格子的金币袋子
情况时找出前k大即可
最后:f[m][n]这个最右下角的格子可能积累了一堆金币,从后往前(从大到小)挑出
k个袋子即可 */
//一个学长(栋神)出的题
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=;
vector<ll>f[maxn][maxn];//f向量用来存每个位置前k大的总金币
ll a[maxn][maxn];//a数组用来存入数据
int main()
{
///输入环节
ll m,n,k;
cin>>m>>n>>k;
for(ll i=;i<=m;i++)
for(ll j=;j<=n;j++)
scanf("%lld",&a[i][j]);//输入金币情况
///处理环节
f[][].push_back(a[][]);
//先向f向量中添加初始金币
//同样的,接下来两个for分别初始化向量左边和上面两个边界的金币数
for(ll i=;i<=m;i++)
f[i][].push_back(a[i][]+(f[i-][])[]);
for(ll i=;i<=n;i++)
f[][i].push_back(a[][i]+(f[][i-])[]);
//因为到最左竖和最上横分别只有一条路径,所以很好处理 ///接下来的向量f[i][j]会一直保持从小到大的排列顺序
for(ll i=;i<=m;i++)
for(ll j=;j<=n;j++)//两个for循环遍历剩下情况
{
//对f[i][j]的上面那格分析
if(k<=f[i-][j].size())//如果要求的k比现在有的元素少
//即如果k比当前vector内元素数目小的情况
for(ll x=f[i-][j].size()-;x>=f[i-][j].size()-k;x--)
{//从f[i-1][j]从后往前挑出k个数(也就是最大的k个数),分别加上a[i][j],塞入f[i][j]中
//这让f[i][j]增加了新的元素,但f[i][j]依然是从小到大排序(为后面服务)
(f[i][j]).insert(upper_bound(f[i][j].begin(),f[i][j].end(),(f[i-][j])[x]+a[i][j]),(f[i-][j])[x]+a[i][j]);
}
else//如果vector内元素数目小,还不够k多的情况
for(ll x=f[i-][j].size()-;x>=;x--)
{//同上
(f[i][j]).insert(upper_bound(f[i][j].begin(),f[i][j].end(),(f[i-][j])[x]+a[i][j]),(f[i-][j])[x]+a[i][j]);
}
//对f[i][j]的左边那格分析
///第一个if else是配套的,只执行一个,这里又是一套if else,只执行一个
//那么每次循环就处理一次上方,处理一次左边
if(k<=f[i][j-].size())//类似于上面,不再叙述
for(ll x=f[i][j-].size()-;x>=f[i][j-].size()-k;x--)
{
f[i][j].insert(upper_bound(f[i][j].begin(),f[i][j].end(),(f[i][j-])[x]+a[i][j]),(f[i][j-])[x]+a[i][j]);
}
else
for(ll x=f[i][j-].size()-;x>=;x--)
{
f[i][j].insert(upper_bound(f[i][j].begin(),f[i][j].end(),(f[i][j-])[x]+a[i][j]),(f[i][j-])[x]+a[i][j]);
}
}
for(ll i=f[m][n].size()-;i>=f[m][n].size()-k;i--)
printf("%lld ",(f[m][n])[i]);
//从后往前数k个数,分别输出(即在f[m][n]找出最大的k个数)
}
前k大金币(动态规划,递推)的更多相关文章
- 最长上升子序列(动态规划递推,LIS)
1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...
- 最大子段和(洛谷P1115,动态规划递推)
洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...
- 7617:输出前k大的数
7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...
- 输出前 k 大的数
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小 ...
- 牛客第六场 J.Heritage of skywalkert(On求前k大)
题目传送门:https://www.nowcoder.com/acm/contest/144/J 题意:给一个function,构造n个数,求出其中任意两个的lcm的最大值. 分析:要求最大的lcm, ...
- (算法)前K大的和
题目: 1.有两个数组A和B,每个数组有k个数,从两个数组中各取一个数加起来可以组成k*k个和,求这些和中的前k大. 2.有N个数组,每个数组有k个数,从N个数组中各取一个数加起来可以组成k^N个和, ...
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...
- 输出前k大的数
总时间限制: 10000ms单个测试点时间限制:1000ms内存限制:65536kB(noi) 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大 ...
- BZOJ2006:超级钢琴(ST表+堆求前K大区间和)
Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
随机推荐
- YTU 2542: 弟弟的作业
2542: 弟弟的作业 时间限制: 1 Sec 内存限制: 128 MB 提交: 130 解决: 57 题目描述 你的弟弟刚做完了"100以内数的加减法"这部分的作业,请你帮他 ...
- 牛客网9.9比赛 C 保护
题目大意: n个城市构成一个树 m支军队 每只军队守卫 在xi到yi的最短路径上的城市 q个重要人物从vi出发 找到离根最近的点使从vi到这个点上所有路径都可以被至少ki个军队完全覆盖 输出每个答案的 ...
- Python中关键字global与nonlocal的区别
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634终于下定决心学习Python了.既然 ...
- [HNOI2005]星际贸易
https://www.zybuluo.com/ysner/note/1309789 题面 要素太多,还是自己看吧 解析 如果要求贸易额最大,就相当于: 有\(n\)个物品(星球),每个物品价值为\( ...
- bzoj4868
http://www.lydsy.com/JudgeOnline/problem.php?id=4868 三分+贪心 我们可以知道这是一个单峰函数 当A>B那么我们每次调整一个的价钱是最佳的,所 ...
- CrystalQuartz实现Quartz的window服务的远程管理
1. 建一个空的ASP.NET WebSite,利用NuGet安装CrystalQuartz.Remote 包 我们可以看到,配置文件中多了如下节点: <crystalQuartz> &l ...
- bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】
参考:https://blog.csdn.net/u010336344/article/details/53034372 神一样的线段树 线段树上维护:ll从左开始最长空段:rr从右开始最长空段:le ...
- [App Store Connect帮助]六、测试 Beta 版本(2)输入测试信息以供外部测试
如果您向外部测试员分发您的 App,您需要输入关于您 App 的额外 TestFlight 测试信息以供“Beta 版 App 审核”.您可以在添加 App 至您的帐户时,或在您邀请外部测试员时输入此 ...
- linux rpm 安装
1.rpm 安装rpm -ivh package_name-i:install的意思-v:查看更详细的安装信息-h:以安装信息栏显示安装进度rpm -ivh package_name --test 2 ...
- 网站开发综合技术 一 JavaScript简介 二JavaScript语法
第1部分 JavaScript简介 1.JavaScript它是个什么东西? 它是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 2.它与Java有什么关系? 没有什么直接联系,java是S ...