入门OJ:简单的网络游戏
题目描述
在某款极具技术含量的网络游戏中,佳佳靠着他的聪明智慧垄断了游戏中的油田系统。油田里有许多油井,这些油井排成一个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)。那么我们可以列出转移方程:
\]
其中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:简单的网络游戏的更多相关文章
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- [电子书] 《Android编程入门很简单》
<Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...
- Redis入门很简单之六【Jedis常见操作】
Redis入门很简单之六[Jedis常见操作] http://www.tuicool.com/articles/vaqABb http://www.cnblogs.com/stephen-liu74/ ...
- 《Mysql 入门很简单》(读后感①)
下载完整版<Mysql 入门很简单>,点击这里~: http://files.cnblogs.com/files/zhengyeye/MySQL%E5%85%A5%E9%97%A8%E5% ...
- Hibernate入门2.简单的项目开发实例
Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...
- 资深架构师Sum的故事:正则!入门就是这样简单
| 故事背景 职场如战场!Sum带领三个小队友用了两周,成功把代理功能给干出来了.如果说产品经理是最魔鬼的指挥官,那测试就是最魔鬼的教官.这两周,让Sum深深领略了什么是X市的日出. 不过话又说回来, ...
- Redis入门很简单之七【使用Jedis实现客户端Sharding】
Redis入门很简单之七[使用Jedis实现客户端Sharding] 博客分类: NoSQL/Redis/MongoDB redisjedisspringsharding分片 <一>. 背 ...
- Redis入门很简单之五【Jedis和Spring的整合】
Redis入门很简单之五[Jedis和Spring的整合] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedisspring 在上一篇文章中,简单介绍了Jedis的 ...
随机推荐
- Hive JDBC执行load时无法从本地加载数据
通过hive-jdcv连接hive server,在应用服务端执行以下命令,报错:Hiver Server节点上找不到data.txt load data local inpath '/home/dw ...
- js上 十二、函数初步-1
11-1.引入(认识函数) 引入: 说起函数,其实我们并不陌生,在初中数学中我们就接触过函数:例如我们所学的 y = 2X+1 ; 这是一个二元一次方程,也是我们数字中的函数: 当我们每次输入 ...
- js下 Day11、案例
一.成绩分类 效果图: 功能思路分析: 1. 渲染数据 2. 鼠标按下开启拖拽 \1. 给成绩盒子绑定鼠标按下事件(mousedown),用事件委托做多个标签的拖拽 \2. 开启控制拖拽的变量 \3. ...
- docker 安装es跟kibana
首先docker 查询es docker search elasticsearch 在docker pull elasticsearch:7.9.3 docker在查询 kibana docker ...
- matplotlib的学习15-次坐标轴
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y1 = 0.05 * x**2 y2 = - ...
- Numpy的学习6-深浅赋值(copy&deep copy)
# = 的赋值方式会带有关联性 import numpy as np a = np.arange(4) # array([0, 1, 2, 3]) b = a c = a d = b # 改变a的第一 ...
- 闭关修炼180天--手写IOC和AOP(xml篇)
闭关修炼180天--手写IOC和AOP(xml篇) 帝莘 首先先分享一波思维导图,涵盖了一些Spring的知识点,当然这里并不全面,后期我会持续更新知识点. 在手写实现IOC和AOP之前(也就是打造一 ...
- 初识SylixOs
SylixOS 概述 SylixOS 是一款大型嵌入式实时操作系统,诞生于 2006 年,起初它只是一个小型多任务调度器,经过多年开发,SylixOS 目前已经成为一个功能完善.性能卓越.可靠稳定的嵌 ...
- C#中RDLC报表判断某字段的值为null
=iif(Isnothing(Fields!VerifyStateName.Value),"未上报",Fields!VerifyStateName.Value) 空值时赋予默认 ...
- 管理Windows上的路由表
路由器获取目录帮助手册: route /? 修改路由的时候最高以管理员运行cmd程序 默认路由只是临时生效的,只要管理员禁用在启用网卡,默认路由就消失了(重启计算机默认路由也会消失),可以在后面添加一 ...