##区间dp##

来源:互联网 发布:画立体图的软件 编辑:程序博客网 时间:2024/05/16 11:05

区间dp

dp[N][N]([…]),记忆化搜索

由于dp[i][j] 转移往往需要枚举k,通常是O(N^3),N不超过200

当然也有不需要枚举的O(N^2)

Light oj 1422

【题意】有个人要参加好多场舞会,需要穿的类型依次为a[i],可以在衣服外套衣服,可以不换衣服(前提是类型满足),但衣服一旦脱了就穿不上了,求最少需要几件衣服(类型不限,想要什么有什么)。

【Sol】 三种转移方式及其条件

dp[i][j]= dp[i][j-1] (arr[i] == arr[j])dp[i][j]= min{dp[i][k]+dp[k+1][j]} (arr[i] == arr[k] && i <= k <= j)dp[i][j]= dp[i+1][j]+1//边界dp[i][i]=1

或者

dp[i][j]= min{dp[i][k]+dp[k+1][j]} (arr[i] == arr[k] && i < k <= j)dp[i][j]= dp[i+1][j]+1//边界dp[i][i]=1dp[i][j]=0 (i>j)


Cf 149D

【题意】给一个合法的括号序列(N<700),要求每对匹配括号有且只有一个涂色(红或蓝选一种),并要求不能出现连续的蓝或红。

【Sol】有点类似数位dp。

LL f(int a,int b,int l,int r){   if (a>=b) return 1;    if (dp[a][b][l][r]!=-1) return dp[a][b][l][r];    LL tmp=0;    /*a染R*/     if (l!=1)tmp+=f(a+1,t[a]-1,1,0)*f(t[a]+1,b,0,r)%e;    /*a染B*/     if (l!=2)tmp+=f(a+1,t[a]-1,2,0)*f(t[a]+1,b,0,r)%e;    /*t[a]染R*/  if (r!=1||t[a]!=b) tmp+=f(a+1,t[a]-1,0,1)*f(t[a]+1,b,1,r)%e;    /*t[a]染B*/  if (r!=2||t[a]!=b) tmp+=f(a+1,t[a]-1,0,2)*f(t[a]+1,b,2,r)%e;    tmp%=e;    return dp[a][b][l][r]=tmp;}

ZOJ 3469

【题意】有n个人叫餐,每个人都在x轴上的xi位置,并且每个人都有个bi。现在送餐员从x轴上的某点出发,带上所有餐,求sum{bi*ti}(1<=i<=n)的最小值

 【Sol】

1.当前送完餐的部分一定是含restaurant的连续的一段

2.必须把对后面的影响考虑在当前状态下,若当前转移用时t,后面还有x人,当前的状态就要多加这x人的bi值的和乘上t

f[a][b][0]//a~b这一段已送完餐,最后停在af[a][b][1]//a~b这一段已送完餐,最后停在b//边界如下,转移略int f(int a,int b,int st){   if (a==b&&a!=res) return inf;    if (a==b&&a==res) return 0;    //……}


Hdu 4283

【题意】与上题类似,去掉上题的xi,送餐(此题是上台)的顺序必须是原顺序的一个合法的出栈序列

【Sol】合法的出栈序列中有一个很重要的性质:[a,b]这是一开始的所有元素,当a第k个出栈时[a+1,a+k-1]肯定比1先出栈,[a+k,b]肯定比a后出栈.。这样一个区间划分成两个子区间[a+1,a+k-1],[a+k,b]。

然后把对后面的影响考虑在当前状态下就可以了。



Hdu 2476

【题意】用刷子每次可以刷一段任意字母,问把串s1刷成同样长度的s2需要的最少步(n<=100)

【sol】假设原来全是数字(对任意i,s1[i]!=s2[i]),是否就是lightoj 1422?

//假设字符串从1开始存ans[i]=ans[i-1];        (s1[i]==s2[i])      =min{ans[j]+f(j+1,i)}  (s1[i]!=s2[i],0<=j<i)

SDUT 1309

【sol】环的处理:拆成2*n的链,求答案时for循环求最小值

for (int i=1;i<=n;i++)        scanf("%d",&t[i]);    for (int i=1;i<=n-1;i++)        t[i+n]=t[i];    //…………    int ans=0x3f3f3f3f;    for (int i=1;i<=n;i++)        ans=min(ans,f(i,i+n-1));

0 0
原创粉丝点击