考虑先枚举所有的物品中最后拿走的,这样就分成了2个子问题,即先拿完左边的,再拿完右边的,最后拿选出的那个。令dp(i,j)表示拿完[i,j]所有物品的最小代价。你可能会说,我们拿[i,j]这一段物品的时候,i左边和j右边的第一个物品可能会不断变化,影响i和j的最终价格。其实是不会的,还是想想一开始说的整个序列枚举最后被拿走的,然后不断分割成子问题的过程,我们都是先拿走[i,j]中的所有元素,之后才会去动i-1或者j+1。所以可以澄清一下dp状态含义:dp(i,j)表示原序列中把[i,j]中的元素全拿完,其他元素全不动的最小代价。转移就很简单了,枚举区间最后被拿走的元素即可。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; int t,n,a[510],b[510],dp[510][510]; int dfs(int lb,int ub)
{
if(lb>ub) return 0;
if(dp[lb][ub]<1e9) return dp[lb][ub];
if(lb==ub) return dp[lb][ub]=a[lb]+(lb==0 ? 0:b[lb-1])+(lb==n-1 ? 0:b[lb+1]);
for(int i=lb;i<=ub;++i) dp[lb][ub]=min(dp[lb][ub],dfs(lb,i-1)+dfs(i+1,ub)+a[i]+(lb==0 ? 0:b[lb-1])+(ub==n-1 ? 0:b[ub+1]));
return dp[lb][ub];
} int main()
{
freopen("buy.in","r",stdin);
freopen("buy.out","w",stdout);
repn(tn,1)
{
scanf("%d",&n);
rep(i,n) scanf("%d",&a[i]);
rep(i,n) scanf("%d",&b[i]);
rep(i,n) rep(j,n) dp[i][j]=1e9;
printf("%d\n",dfs(0,n-1));
}
return 0;
}

最新文章

  1. html转义字符
  2. rabbitmq消息队列——&quot;发布订阅&quot;
  3. systemctl 取代 service
  4. delphi常用快捷键(我自己经常使用的)
  5. POJ 2240 &amp;&amp; ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
  6. 移动端开发的meta标签作用
  7. sqlserver中的锁
  8. [Angular 2] 8. Better ES5 Code
  9. Bestcoder #80
  10. CommandLineRunner和ApplicationRunner的区别
  11. underrun || overrun
  12. 无焦点下获取条码枪返回值的Hook(再次改良版)
  13. jquery.jCal.js显示日历插件
  14. 2018/04/04 PHP 中的 数组排序问题
  15. ubuntu16.04编译QT5.6所依赖的库
  16. LeetCode——Fizz Buzz
  17. gradle 安装试用
  18. Arduino I2C + 数字式环境光传感器BH1750FVI
  19. Weekly Contest 118
  20. MySQL数据导入导出方法与工具mysqlimport

热门文章

  1. 【C语言】超详讲解☀️指针是个什么针?(一次性搞定指针问题)
  2. 推荐系统-协同过滤在Spark中的实现
  3. BI报表与数据开发
  4. Javascript 函数声明、调用、闭包
  5. 新型MPP的Doris数据库:数据模型和数据分区使用详解
  6. Python 汽车之家 全系车型参数(包含历史停售车型) 最全
  7. Apache DolphinScheduler 1.3.9 发布,新增 StandaloneServer
  8. Redis 05 集合
  9. Spring源码 06 IOC refresh方法1
  10. 前端必备的 HTTP 知识