题目描述

在某款极具技术含量的网络游戏中,佳佳靠着他的聪明智慧垄断了游戏中的油田系统。油田里有许多油井,这些油井排成一个M*N的矩形。每个油井都有一个固定的采油量。每两个相邻的油井之间有一条公路,这些公路是油井与油井之间唯一的运油方式。佳佳的领地在油田的右方和下方,他需要把采到的油通过这些公路运输到他的领地。为了保证采到的油以最快的方式供给右方和下方的领地,对于每个油井,佳佳总是将采到的油分成非空的两部分将其中一部分沿公路一直向右运输到油田的右边界,将另一部分沿公路一直向下运输到油田的下边界。然而树大招风,网络游戏中的GM以保证游戏公平为由,要求佳佳主动贡献出K个油井。更惨的是,失去某些油井不单意味着采油量减少,这还将会导致运输线路的中断。如果佳佳贡献出了某个油井,那么所有要经过这个油井的运输任务将无法完成。佳佳想保证贡献K个油井之后自己的损失最小(损失即为失去的所有油井的采油量之和),而他希望其他的所有油井还能够像往常一样正常运输。于是他向你求救,希望你能帮助他实现他的想法。

输入格式

第一行有三个用空格隔开的正整数M,N和K,它们分别表示油田的长、宽和佳佳需要贡献出的油田数。以下N行中每行有M个用空格隔开的正整数。这些正整数保证不超过10000,它们描述了油田中各个油井的采油量。 输入数据保证K<=M*N,M<=60,N<=60。

输出格式

一个整数,表示佳佳最少要损失的采油量。


分析题目后可以得出这样一个结论:

设c(i,j)表示第i行前j个油井的采油量之和,那么放弃点(x,y)的油井的代价就是:c(x,y)。由于c数组当i确定的时候随j的变大单调不下降,所以我们对于第i行放弃的油井应该为从左端点开始的连续一段油井。同理对于第i列放弃的油井也应该为从上断电开始的连续一段油井。

通过这个结论可以进一步推导:

当前行选择的油井数必须小于等于上一行选择的油井数。

于是我们很容易设计出这样的状态:dp(i,j,k)表示第i行选了j个油井,并且1~i行一共选了k个油井(不是题目的K)。那么我们可以列出转移方程:

\[dp[i][j][k]=Min{\{}dp[i-1][l][j-k]+c[i][k]{\}}
\]

其中l为上一行选择的油井数。初始状态dp(1,i,i)=c(1,i),目标状态为Min{dp(n,i,K)}。

* 一个明显的优化是dp数组的第一维可以滚掉。

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 61
#define maxm 3601
using namespace std; int dp[maxn][maxn][maxm],c[maxn][maxn];
int n,m,sum; inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
} int main(){
m=read(),n=read(),sum=read();
for(register int i=1;i<=n;i++){
for(register int j=1;j<=m;j++) c[i][j]=c[i][j-1]+read();
} memset(dp,0x3f,sizeof dp);
for(register int i=0;i<=m;i++) dp[1][i][i]=c[1][i];
for(register int i=2;i<=n;i++){
for(register int j=0;j<=min(sum,i*m);j++){
for(register int k=0;k<=min(sum,min(m,j/i));k++){
for(register int l=k;l<=min(sum,min(m,(j-k)/(i-1)));l++){
if(j>l) dp[i][k][j]=min(dp[i][k][j],dp[i-1][l][j-k]+c[i][k]);
}
}
}
}
int ans=0x3f3f3f3f;
for(register int i=0;i<=min(sum,m);i++){
ans=min(ans,dp[n][i][sum]);
}
printf("%d\n",ans);
return 0;
}

入门OJ:简单的网络游戏的更多相关文章

  1. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  2. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

    1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...

  3. [电子书] 《Android编程入门很简单》

    <Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...

  4. Redis入门很简单之六【Jedis常见操作】

    Redis入门很简单之六[Jedis常见操作] http://www.tuicool.com/articles/vaqABb http://www.cnblogs.com/stephen-liu74/ ...

  5. 《Mysql 入门很简单》(读后感①)

    下载完整版<Mysql 入门很简单>,点击这里~: http://files.cnblogs.com/files/zhengyeye/MySQL%E5%85%A5%E9%97%A8%E5% ...

  6. Hibernate入门2.简单的项目开发实例

    Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...

  7. 资深架构师Sum的故事:正则!入门就是这样简单

    | 故事背景 职场如战场!Sum带领三个小队友用了两周,成功把代理功能给干出来了.如果说产品经理是最魔鬼的指挥官,那测试就是最魔鬼的教官.这两周,让Sum深深领略了什么是X市的日出. 不过话又说回来, ...

  8. Redis入门很简单之七【使用Jedis实现客户端Sharding】

    Redis入门很简单之七[使用Jedis实现客户端Sharding] 博客分类: NoSQL/Redis/MongoDB redisjedisspringsharding分片 <一>. 背 ...

  9. Redis入门很简单之五【Jedis和Spring的整合】

    Redis入门很简单之五[Jedis和Spring的整合] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedisspring  在上一篇文章中,简单介绍了Jedis的 ...

随机推荐

  1. js上 六、运算符-2

    6.1.关系运算符 用来进行比较的.比较的结果通常是布尔值真和假. ü ==:相等,只比较值是否相等 ü ===:全等,比较值的同时比较数据类型是否相等 ü !=:不相等,比较值是否不相等 ü !== ...

  2. Python高级语法-对象实例对象属性-类与实例,class方法静态方法等(4.6.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 python中属性:类属性,实例属性 方法:类方法,实例方法,静态方法 想修改类属性,只能是类方法,因为只有类方法把cls(类)传入数据里面 静态方法 ...

  3. pandas的学习5-导入导出数据

    import pandas as pd ''' pandas可以读取与存取的资料格式有很多种,像csv.excel.json.html与pickle等-, 详细请看官方说明文件 ''' # read ...

  4. ​grafana 的主体架构是如何设计的?

    ​grafana 的主体架构是如何设计的? grafana 是非常强大的可视化项目,它最早从 kibana 生成出来,渐渐也已经形成了自己的生态了.研究完 grafana 生态之后,只有一句话:可视化 ...

  5. JavaScript之经典面试题

    1.作用域经典面试题 var num = 123; // f1函数写好了,作用域就定下来了,也就是作用域链定下来了 // f1函数作用域链: f1函数作用域 ==> 全局作用域 function ...

  6. PHP代码样例

    1 <?php 2 3 /** 4 * 时间:2015-8-6 5 * 作者:River 6 * 超级有用.必须收藏的PHP代码样例 7 */ 8 class Helper { 9 10 /** ...

  7. 实用干货!Java开发企业级权限管理系统视频教程

    全程手把手带你运用Java技术栈,打造一套基于最流行的RBAC拓展模型的,分布式的,有界面的,高灵活性,高拓展性的企业级权限管理系统.学完本课程你将可以轻松应对绝大多数企业开发中与权限管理及后台系统相 ...

  8. android 使用 Lottie

    1.添加依赖 dependencies { implementation 'com.airbnb.android:lottie:2.5.5'//lottie } 2.1layout实现 <?xm ...

  9. 安装简易OpenShift单节点并配置DNS泛域名

    1 楔子 公司有个项目部署在 OpenShift 容器云平台上,出现问题较多,于是萌生在公司环境搭建现场仿真环境,由于资源没有生产环境多,就使用单节点简单模拟下 本文主要内容包括以下: 使用 Dnsm ...

  10. python-OpenCV 使用GrabCut来实现图片的前景与后景的分割

    先上一个效果图: 使用Python3.7+OpenCV 3.x. 需要引入 numpy库. 在图上用鼠标左键和右键标记前景和后景即可.如果需要重新标记图像,关闭程序重新运行. 以下是具体实现代码. # ...