企鹅的游戏(penguin)

题目描述

Shiva养了一只小企鹅。小企鹅很聪明,她总是帮Shiva和他的好朋友想出很多很好玩的游 戏。其中有一个游戏特别经典,Shiva和他的小伙伴们百玩不厌。 游戏规则如下: 先给出2个正整数序列A1、A2,序列长度分别为L1,L2 (1 ≤ L1, L2 ≤ 5000)。你可以 做如下移动:移去第一个序列的最后P1 (P1≥1) 个数(可以是整个序列)并得到它们的和 S1,同时移去第二个序列的最后P2 (P2≥1)个数(可以是整个序列)并得到它们的和S2。 那么这次移动的费用为 (P1-S1)*(P2-S2)。你可以继续游戏直到两个序列为空,所以不允许一个数列空了,而另一个数列中还有数。而这次游戏 的费用就为每次移动费用的和。 你现在的目标是使这次游戏的费用最小。 注意:序列能为空当且仅当两个序列同时为空。

输入

第一行两个正整数L1,L2分别表示两个序列的长度; 第二行L1个正整数,描述序列A1[1..L1],第i个正整数为A1[i] 第三行L2个正整数,描述序列A2[1..L2],第i个正整数为A2[i] 除L1,L2外,所有的整数均不超过1000。

输出

一个正整数表示该次游戏的最小费用

样例输入

3 2
1 2 3
1 2

样例输出

2

提示

对于30%数据,1<=L1,L2<=50

对于60%数据,1<=L1,L2<=500

对于100%数据,1<=L1,L2<=5000


solution

可以发现每次操作k1或者k2一定有一个等于1

(直观的想多个乘一起一定不优)

效率O(n^3)

有个技巧 把a[i]--;

f[i][j]=min(f[i][j],f[i-1][j]+a[i]*b[j]);
f[i][j]=min(f[i][j],f[i][j-1]+a[i]*b[j]);
f[i][j]=min(f[i][j],f[i-1][j-1]+a[i]*b[j]);

为什么这样可以呢

假设代价是a*(b+c)

我们可以理解为a*b+a*c

那就相当于b时留着a不删去c时再删去

include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 2005
using namespace std;
int n,m,f[maxn][maxn],a[maxn],b[maxn];
int main()
{
cin>>n>>m;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)f[i][j]=1e9;
for(int i=n;i>=1;i--){scanf("%d",&a[i]);a[i]--;}
for(int i=m;i>=1;i--){scanf("%d",&b[i]);b[i]--;}
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j]=min(f[i][j],f[i-1][j]+a[i]*b[j]);
f[i][j]=min(f[i][j],f[i][j-1]+a[i]*b[j]);
f[i][j]=min(f[i][j],f[i-1][j-1]+a[i]*b[j]);
}
}
cout<<f[n][m]<<endl;
return 0;
}

企鹅的游戏(penguin)的更多相关文章

  1. iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

    iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面Empt ...

  2. FC红白机游戏列表(维基百科)

    1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...

  3. 玩家福音:10款最佳Linux免费游戏

    “我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...

  4. 开源玩家福利:十大Linux免费游戏

    假如当你考虑从Windows平台迁移至Linux平台时,“我能在Linux平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是“快去Linux平台吧!”.感谢开源组织一直以来坚持不懈为Linu ...

  5. Java的集合框架

    01.为什么要使用集合框架? 解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架. 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护. 集合 ...

  6. windows程序防狼术入门

    当初由于一些原因以及兴趣,学习了一段时间软件逆向,对于软件加密解密有了点粗略的了解.而后看到某些同学辛辛苦苦的搞出个软件,自己费心费力去加密,但搞出来后往往能被秒破,实不忍心.今天大概总结下一些基本的 ...

  7. Java学习笔记——封装、继承和多态

    先说说封装: 用new 一条狗来举个例子: public class Dog { //私有化字段 private String name; private int age; //无参构造 Dog(){ ...

  8. java的方法重写 ,多态和关键字 instanceof和final

    package cn.pen; /*final 是一个java的关键字,用于修饰局部变量.属性.方法.类,表示最终的意思. final修饰类表示最终类,无法被继承.public final class ...

  9. Java面向对象的三大特性之一 多态

    多态: 子类重写父类方法 1)位置:子类和父类中有同名的方法 2)方法名相同,返回类型和修饰符相同,参数列表相同       方法体不同 多态的优势和应用场合 多态:同一个引用类型,使用不同的实例而执 ...

随机推荐

  1. 通过Jquery获取RadioButtonList选中值

    推荐 使用第二种,第一种有时候不起作用 第一种:通过find方法 获取RadioButtonList所选中的值 <script type="text/javascript"& ...

  2. SpringBoot学习3:springboot整合filter

    整合方式一:通过注解扫描完成 Filter 组件的注册 1.编写filter package com.bjsxt.filter; import javax.servlet.*; import java ...

  3. iOS进阶面试题

    1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ // https://github. ...

  4. find cat sed awk 简单组合使用

    find:查找 // .表示当前目录:   /表示根目录:  | 管道符:  xargs表示将前面的搜索接口作为参数传递到后面的命令中:grep 过滤 // xxxx表示文件名 1.查找指定文件名的文 ...

  5. LRU算法原理解析

    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的. 现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理.他将主存 ...

  6. django_数据库操作—增、删、改、查

    增加 增加数据有两种方法 1> sava >>> from datetime import date >>> book = BookInfo( btitle= ...

  7. 笔记-网络-抓包-wireshark

    笔记-网络-抓包-wireshark 1.      开始 环境:win8笔记本,无线网 1.1.    无线网卡设置 因为需抓捕无线网卡上的数据包,需要进行一项设置,如捕获有线网卡,无需设置. 打开 ...

  8. Appium运行时没有启动activity的权限:A new session could not be created.(Original error: Permission to start activity denied)

    小白搞appium,遇到启动不了activity的问题: 查找解决方案说是跟AndroidManifest.xml有关系,参考:https://github.com/appium/appium/iss ...

  9. java并发面试题-基础

    多线程 java中有几种方法可以实现一个线程? 1.直接继承thread类:2.实现runnable接口: 如何停止一个正在运行的线程?可以使用正在运行的线程,支持线程中断,通常是定义一个volati ...

  10. windows下git安装以及基本配置

    一.首先要下载git然后进行默认安装即可,然后查看系统环境变量是否添加     二.桌面右击鼠标,选择git bash 进入操作页面 git --version 检测是否安装成功   安装完成有配置一 ...