hdu 4283 You Are the One(区间dp)

Posted jpphy0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 4283 You Are the One(区间dp)相关的知识,希望对你有一定的参考价值。

问题

hdu 4283 You Are the One - https://acm.hdu.edu.cn/showproblem.php?pid=4283

分析

  • 卡特兰数(例题1)
  • 根据区间 [ l , r ] [l,r] [lr] 内的第1个数出现的位置,将问题分解为两个子问题,子问题的区间分别是 [ l + 1 , i ] [l+1,i] [l+1i] [ i + 1 , r ] [i+1,r] [i+1r] i ∈ { l , ⋯ , r } i \\in \\{l,\\cdots ,r\\} i{lr},遍历 i i i 即可求解
  • 转移方程:
dp[l][r] = min(dp[l][r], dfs(l+1,i)+(i-l)*(d[l]-d[l-1])+(i-l+1)*(d[r]-d[i])+dfs(i+1,r));
  • 注意
    • ( k − 1 ) ∗ d [ i ] (k-1)*d[i] (k1)d[i] 中的 k k k 是区间内的位置,不能是原序列中的位置
    • 子问题 [ l + 1 , i ] [l+1,i] [l+1i] 的位置是从 1 1 1 开始,子问题 [ i + 1 , r ] [i+1,r] [i+1r] 的位置从 i − l + 2 i-l+2 il+2 开始
    • d[i] 是前缀和, d [ i ] − d [ i − 1 ] d[i]-d[i-1] d[i]d[i1] 才是原始的输入数据,它的位置是 i − l + 1 i-l+1 il+1

代码

/* hdu 4283 You Are the One 区间dp*/
#include<bits/stdc++.h>
using namespace std;
const int MXN = 110;
const int inf = 0x7f7f7f7f;
int n, d[MXN], dp[MXN][MXN];
int dfs(int l, int r){
	int &D = dp[l][r];
	if(D < inf) return D;
	if(l >= r) return D = 0;	
	for(int i = l; i <= r; ++i)
		D = min(D, dfs(l+1,i)+(i-l)*(d[l]-d[l-1])+(i-l+1)*(d[r]-d[i])+dfs(i+1,r));
	return D;
}
int main(){
	int t, T = 0;
	scanf("%d", &t);
	while(t--){
		scanf("%d", &n);
		for(int i = 1; i <= n; ++i) scanf("%d", d+i);
		d[0] = 0, memset(dp, 0x7f, sizeof dp);
		for(int i = 1; i <= n; ++i) d[i] += d[i-1];		
		printf("Case #%d: %d\\n", ++T, dfs(1, n));
	}	
    return 0;
}

以上是关于hdu 4283 You Are the One(区间dp)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4283---You Are the One(区间DP)

刷题总结——you are the one(hdu4283)

HDU-4283 You Are the One (区间DP)

HDU4283:You Are the One(区间DP)

hdu 4283 You Are the One 区间dp

HDU 4283 You Are the One