题目:

题目描述

给定 2 个正整数序列 A1, A2,序列长度分别为 L1, L2。
你可以进行以下的一次操作:
1. 选择两个数 K1,K2(1≤K1≤L1, 1≤K2≤L2);
2. 移去 A1 中最后 K1 个数,得到这 K1 个数的和 S1,L1 对应减少 K1;
3. 移去 A2 中最后 K2 个数,得到这 K2 个数的和 S2,L2 对应减少 K2;
此次操作的费用为:(S1-K1) * (S2-K2)。
进行以上操作直至两个序列都为空,求最小的费用总和。
注意:序列为空当且仅当两个序列同时为空。

输入格式

第一行是两个正整数 L1和 L2,表示 A1 与 A2 的长度。
第二行 L1 个整数,表示序列 A1[1..L1]。
第三行 L2 个整数,表示序列 A2[1..L2]。

输出格式

输出一个整数,表示最小费用。

样例数据 1

输入  [复制]

 

3 2 
1 2 3 
1 2

输出

2

备注

【样例说明】
第一次选取 K1=1,K2=1。费用为 (3-1)*(2-1) = 2。
第二次选取 K1=2,K2=1。费用为 (1+2-2)*(1-1) = 0。
所以,总费用为 2。

【数据范围】
对 20% 的输入数据:1≤L1,L2≤20
对 40% 的输入数据:1≤L1≤400;1≤L2≤150
对 100% 的输入数据:1≤L1,L2,A1[1..L1],A2[1..L2]≤5,000

题解:

很好的一道dp题·····

首先容易想到,为了消除每次sum-k中k带来的影响,我们可以将所有元素-1,这样每次计算的时候直接sum相乘即可····

然后考虑消除的策略···

打个比方l1=l2=4···我们如果要消除a1[l1]到a1[2]和a2[l2]到a2[3]这两段区间的数的话···最好的策略肯定不是直接一次性消除···而是先消除a1[l1]和a2[l2]这两个数,再消除a1[3]到a1[2]和a2[3]这两段····因此不难发现··每次消除的话a1和a2的区间长度有一个一定为1!

所以我们可以将区间消除转化为要么消除两段末端a1[x],a2[y]中其中一个··要么同时消除两个末端··且此时对答案的贡献为a1[x]*a2[y];

得出dp方程

f[i][j]=min(f[i][j+1],f[i+1][j],f[i+1][j+1])+a1[i+1]*a2[j+1]

其中f[i][j]表示两段分别剩余i,j个数时的最少费用

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
inline int R()
{
char c;int f=,i=;
for(c=getchar();(c<''||c>'')&&c!='-';c=getchar());
if(c=='-') c=getchar(),i=-;
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f*i;
}
int l1,l2,a1[N],a2[N];
int f[N][N];
int main()
{
//freopen("a.in","r",stdin);
l1=R(),l2=R();
memset(f,inf,sizeof(f));
for(int i=;i<=l1;i++) a1[i]=R(),a1[i]--;
for(int i=;i<=l2;i++) a2[i]=R(),a2[i]--;
f[l1-][l2-]=a1[l1]*a2[l2];
for(int i=l1-;i>=;i--)
for(int j=l2-;j>=;j--)
{
if(i==l1-&&j==l2-) continue;
f[i][j]=min(f[i][j+],min(f[i+][j+],f[i+][j]))+a1[i+]*a2[j+];
}
cout<<f[][]<<endl;
return ;
}

最新文章

  1. 【SAP BO】无法识别账户信息:无法访问CMS。计算机上的CMS由于某个严重错误而停止。(FWM 20031)
  2. Android:Toast
  3. 使用yuicompressor-maven-plugin压缩js及css文件
  4. php class中public,private,protected的区别,以及实例
  5. ASP.NET 导入EXCEL文档
  6. KB006: CSS 框模型( Box module )
  7. SharedPreferences基础
  8. Audio Offload
  9. 使用Windows2003创建DNS服务器 - 进阶者系列 - 学习者系列文章
  10. [转载] MapReduce工作原理讲解
  11. [BZOJ1041] [HAOI2008] 圆上的整点 (数学)
  12. fedora27安装DB2 Express-C 11
  13. fiddler限制网速
  14. ImageMagick: win7 | win8 &amp; uac (用户帐户控制) 注册表的一些事
  15. python中@staticmethod、@classmethod和实例方法
  16. java poi 合并 word文档
  17. epoll的高效实现原理
  18. javascript json 判断项目 是否存在不存在插入foreach 组合 输出
  19. ldap文件
  20. MQTT-SN协议乱翻之消息格式

热门文章

  1. POJ 4020 NEERC John&#39;s inversion 贪心+归并求逆序对
  2. [CV笔记]inRange对图像进行分割
  3. 禁止DataGridView控件中添加和删除行
  4. docker-企业级镜像仓库harbor
  5. Python——流程控制语句
  6. NOIP模拟赛 czy的后宫
  7. linux文件属性之用户和组基础知识
  8. day12-迭代器
  9. poj-1979 red and black(搜索)
  10. Linux学习-开放源码的软件安装与升级简介