题目描述

在某款极具技术含量的网络游戏中,佳佳靠着他的聪明智慧垄断了游戏中的油田系统。油田里有许多油井,这些油井排成一个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. windows10 64位下安装oracle 11g和PL/SQL Developer

    一.材料准备: oracle11g安装包(64位) oracle11g客户端(32位) PL\SQL Developer安装包(32位) 1.下载Oracle 11g链接:http://www.ora ...

  2. html 02-浏览器的介绍

    02-浏览器的介绍 #常见的浏览器 浏览器是网页运行的平台,常见的浏览器有谷歌(Chrome).Safari.火狐(Firefox).IE.Edge.Opera等.如下图所示: 我们重点需要学习的是 ...

  3. C++libcurl的使用

    一.libcurl描述: 在curl的官方网站 **http://curl.haxx.se/download.html** 提供编译好libcurl包,  最后写一个demod工程,演示下libcur ...

  4. Python编程学习爆破一些简单加密的文件

    前言 这里只是分享一下Python如何生成爆破字典,对于简单的一些加密文件,咱们可以跑字典获取正确的密码,比如zip加密文件.这里小编给大家简单的介绍一下爆破字典的方法,希望对大家学习Python有帮 ...

  5. C#中的深度学习(四):使用Keras.NET识别硬币

    在本文中,我们将研究一个卷积神经网络来解决硬币识别问题,并且我们将在Keras.NET中实现一个卷积神经网络. 在这里,我们将介绍卷积神经网络(CNN),并提出一个CNN的架构,我们将训练它来识别硬币 ...

  6. python初学者-使用for循环做一个九九乘法表

    for i in range(1, 10): for j in range(1, i + 1): print(j, '*', i, '=', i * j, end=" ") #en ...

  7. 小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework

    小马哥出手的Spring栈核心编程思想课程,可以说是非常专业和权威的Spring课程.课程主要的方向与核心是Spring Framework总览,带领同学们重新认识重新认识IoC,Spring IoC ...

  8. STM32F103的CAN结构体学习

    使用STM32F103的CAN通信就是用这4个结构体函数,把他们理解透了,CAN就好用了 CAN的结构体定义在stm32f10x_can.h里面 /************************** ...

  9. 用python写注入漏洞的poc

    webug靶场一道简单的注入题 加点后报错 could not to the database You have an error in your SQL syntax; check the manu ...

  10. [LeetCode]Path Sum系列

    1.二叉树路径求指定和,需要注意的是由于有负数,所以即使发现大于目标值也不能返回false,而且返回true的条件有两个,到叶节点且等于sum,缺一不可 public boolean hasPathS ...