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] [l,r] 内的第1个数出现的位置,将问题分解为两个子问题,子问题的区间分别是 [ l + 1 , i ] [l+1,i] [l+1,i] 和 [ i + 1 , r ] [i+1,r] [i+1,r], i ∈ { l , ⋯ , r } i \\in \\{l,\\cdots ,r\\} i∈{l,⋯,r},遍历 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] (k−1)∗d[i] 中的 k k k 是区间内的位置,不能是原序列中的位置
- 子问题 [ l + 1 , i ] [l+1,i] [l+1,i] 的位置是从 1 1 1 开始,子问题 [ i + 1 , r ] [i+1,r] [i+1,r] 的位置从 i − l + 2 i-l+2 i−l+2 开始
- d[i] 是前缀和, d [ i ] − d [ i − 1 ] d[i]-d[i-1] d[i]−d[i−1] 才是原始的输入数据,它的位置是 i − l + 1 i-l+1 i−l+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)