首页 > 其他分享 >[题解] HDU 5115 Dire Wolf 区间DP

[题解] HDU 5115 Dire Wolf 区间DP

时间:2022-08-17 21:45:53浏览次数:60  
标签:5115 HDU lb int 题解 510 ub dp define

考虑先枚举所有的物品中最后拿走的,这样就分成了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;
}

标签:5115,HDU,lb,int,题解,510,ub,dp,define
From: https://www.cnblogs.com/legendstane/p/16596848.html

相关文章

  • 题解 CF1575D【Divisible by Twenty-Five】
    值域非常小,其中只有\(4\times10^6\)个数是\(25\)的倍数,因此可以暴力枚举所有位数正确的\(25\)的倍数,然后检查是否合法。检查方法就是枚举每一位,如果是数字就必须一......
  • CF Round 814 Div2 题解
    A题ChipGame(签到)给定一个\(n\)行\(m\)列的方格矩阵,左下角是\((1,1)\),右上角是\((m,n)\)。(采取了类似笛卡尔坐标系的表示法,不是普通的\(x\)行\(y\)列)Burenka......
  • CF578C题解
    看到题面的第一眼是这玩意儿关于x是单谷的,证明稍微想了一下:设\(f[k]\)和\(g[k]\)是原序列中长度为\(k\)的子区间的最大子区间和最小子区间,给定\(x\)时答案就相......
  • HDU-3065 病毒侵袭持续中
    思路:AC自动机模板题,最后拓扑优化即可,存下每个单词结尾的编号,通过编号找出它是否被遍历过。注意:该题是多组案例。实现:#include<stdio.h>#include<string.h>const......
  • HDU - 2896 病毒侵袭
    思路:AC自动机模板题,最后拓扑优化即可。注意:该题行末有空格会PE。该题是所有ASCII值,所以遍历的时候不能遍历到26,取字母的时候不能-'a'实现:#include<stdio.h>#incl......
  • CF1719C Fighting Tournament 题解
    思路根据题意,很容易看出,每个人都完成一次比赛后,即完成\(n-1\)轮之后,力量值最大的人会留在第一的位置,且在第\(n-1\)轮完成后,除了力量值最大的人,其他人的胜场数都不会再......
  • CF1719A Chip Game 题解
    题目传送门。思路当其中一个人不能动的时候,这个人一定位于点\((n,m)\)上。令点\((n,m)\)为终点。当\(n\)和\(m\)都是奇数或当\(n\)和\(m\)都是偶数时,赢的人......
  • CF1719B Mathematical Circus 题解
    一道不错的构造题。思路先说一句废话,能被\(4\)整除的数在除以\(2\)之后得到的数还是一个偶数。我们可以根据\(k\)的奇偶性以及\(k\)除以\(2\)之后的奇偶性分......
  • hdu7226
    题面给出一个排列,把每个位置视为点,建一个无向图,\(i,j\)之间的边权为\(|i-j|\times|p_i-p_j|\)。求这个图的最小生成树。数据范围:\(n\le5\times10^4\)。题解这......
  • BSOJ7020题解
    脑抽了。考场上应该做掉这题的。所以实际挂分从100pts变成了200pts/fn/fn/fn考虑用一个二元组来维护链,\((f,g)\)表示这个集合的所有链的点权和为\(f\),有\(g\)条链,目......