题目链接

题意:
给定两个正整数数列,你要用它们来做一个游戏:你需要对数列进行若干次操作,每一次操作,应选择两个正整数K1和K2 ,并删除第一个数列的最后K1个数,计算出它们的和S1;删除第二个数列的最后K2个数,计算出它们的和S2。这一次操作的得分就是(S2-K2 )*(S1-K1 )。两个数列应同时被清空,不允许一个数列空了,而另一个数列中还有数。游戏的总得分就是每一次操作的得分总和。

求最小的总得分。

数列长度<=2000<=2000<=2000,权值都是正整数。

题解:
这种题看起来评分不高,但是其实也不一定就很好做。一般代码很短的题都会思维难度不低。

这个题最简单的dp想法是dp[i][j]dp[i][j]dp[i][j]表示第一个数列考虑了后iii个数,第二个数列考虑了后jjj个数的最小答案。最暴力的转移方法是枚举两个数列的上一个位置分别在哪里,这样可以得到一个O(n2∗m2)O(n^2*m^2)O(n2∗m2)的做法。但是这个做法似乎也不太能用一些常规的手段来优化。

但是这个题的正确做法并不是更换状态,而是更换转移思路。首先对于贡献答案的式子中减去的那个区间长度,我们转化成在两个数列里的每个数的权值都减去111,这样根据乘法的分配律,相乘之后结果不会改变的。这样之后我们不去枚举两个数列上一次的端点在哪里了,而是直接从前面的位置转移过来。我们考虑两次合并,设第一次的贡献是a1∗b1+a2∗b2a1*b1+a2*b2a1∗b1+a2∗b2,那么如果两次合为一次的话贡献是(a1+a2)∗(b1+b2)(a1+a2)*(b1+b2)(a1+a2)∗(b1+b2),后者一定大于前者,所以我们分的段数越多答案越优。由于两端长度不一定相同,所以我们每次一定是在一个数列选了一个数,再另一个数列选了连续的几个数。那么我们就在转移的时候考虑当前是在两个数列都是一个数,还是第一个数列仍然用之前的数,第二个数列继续加进新的数,或者第一个数列继续加进来新的数,第二个数列仍然是只选之前的那一个数。于是我们得出dp方程式:dp[i][j]=min(dp[i−1][j−1],dp[i][j−1],dp[i−1][j])+a[i]∗b[j]dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+a[i]*b[j]dp[i][j]=min(dp[i−1][j−1],dp[i][j−1],dp[i−1][j])+a[i]∗b[j]。根据乘法的分配律,可以保证这样算的正确性。

这样就可以用一个状态数是O(n∗m)O(n*m)O(n∗m),转移复杂度是O(1)O(1)O(1)的dp来解决这个题了。

代码:

#include <bits/stdc++.h>
using namespace std;int n,m,a[2010],b[2010],dp[2010][2010];
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);--a[i];}for(int i=1;i<=m;++i){scanf("%d",&b[i]);--b[i];}memset(dp,0x3f,sizeof(dp));dp[0][0]=0;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j)dp[i][j]=min(dp[i-1][j-1]+a[i]*b[j],min(dp[i-1][j]+a[i]*b[j],dp[i][j-1]+a[i]*b[j]));}printf("%d\n",dp[n][m]);return 0;
}

洛谷1846 游戏 dp相关推荐

  1. 洛谷小游戏大全(用洛谷的人都得知道)

    洛谷小游戏大全网址: www.luogu.com.cn/paste/1agz1vs7 其实就是洛谷首页网址加 paste/1agz1vs7 云剪贴板 - 洛谷https://www.luogu.com ...

  2. 题解——洛谷P2734 游戏A Game 题解(区间DP)

    题面 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的 ...

  3. 洛谷P2734 游戏 A Game

    传送门 题目大意:从一个序列两端取数,先后手两人 均采用最优策略,问先后手的得分. 题解: 区间dp 如果先手面临的状态是a1,a2,a3,a4,a5. 如果取走一个那么后手面临的状态是a2,a3,a ...

  4. 洛谷P3146 区间dp做题笔记

    不是题解,不是题解,不是题解,纯属个人笔记,不知所言. 传送门:P3146 问:什么时候才能写的一手漂亮的dp? 答:夜深人静之时,魂归故里之日. 此题是一道基础的区间dp的题,看完题解犹豫片刻,之后 ...

  5. 洛谷1373(dp)

    常规线性dp,需要时就加一维.\(dp[i][j][t][s]\)表示在点\((i,j)\)时瓶子里剩\(t\)且为\(s\)走(0代表小a,1代表uim)时的方案数. de了半天发现是初次尝试的快速 ...

  6. 洛谷--橙色百道DP总结

    最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...

  7. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  8. 洛谷 U266184 宠物小精灵之收服

    题目链接:宠物小精灵之收服 - 洛谷 标签:dp.背包问题 思路: 精灵球个数 与 对皮卡丘的伤害 都可以看成背包问题中的体积,所以将dp数组升级为二维 dp[i][j]表示 i个精灵球 j滴血皮卡丘 ...

  9. 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)

    洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...

最新文章

  1. hashCode和equals方法的关系
  2. angularjs 工具方法
  3. QT的mouseMoveEvent事件失效
  4. 夜读丨72名研究生被清退:孩子,你前半生偷的懒,后半生得拼命还
  5. gcc/g++超详细上手教程
  6. 7系统内部系统组件禁止休眠_海康监控系统平台设计思路(二)
  7. 国产芯片WiFi物联网智能插座—电源功能设计
  8. flex java blazeds_Flex同Java通信--BlazeDS入门图文详解(上)
  9. SQLite3数据库
  10. 百年通信史:落后西方半世纪的中国,用20年绝地反杀!
  11. 电脑公司Windows7_X86旗舰版V0911
  12. maya中英文对照_玛雅中英文对照(全)
  13. python基础学习总结
  14. AUTOCAD——三种修剪方式
  15. Android Studio设置自动换行快捷键
  16. 动网产品失败, 合作伙伴寒心离去
  17. 由Table_locks_waited想到的mysql 表锁问题
  18. java的正向代理和反向代理
  19. 高仙技术家|SLAM(二)——完善回环检测的视觉SLAM
  20. android开发设置Button背景颜色

热门文章

  1. python数据增强三种方法
  2. WIN2003通用GHOST封装教程详解
  3. vue 动态设置组件高度_高度动态的Vue明星评分组件
  4. Highcharts如何设置背景颜色
  5. 使用U盘安装最新的UBUNTU等linux系统
  6. 每隔 2 秒刷新抢票次数,携程抢票服务疑似造假
  7. OCP-1Z0-053-V12.02-676题
  8. 计算机病毒 英语 作文,高中精华双语文章:计算机病毒--“我爱你”
  9. Centos7安装Squid代理服务及配置透明代理
  10. Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.properties.Configurati