您的位置:首页 > 其它

区间DP poj 2955 hdu 2476

2015-06-13 10:42 453 查看
区间DP以前 其实我都没怎么做过  因为队里面一直有人会  就一直没去看他  - =

写了一道入门题  和 上次没过的那题 大致有个了解了吧!

其实感觉有点像以前讲的 分治算法  对于每个区间里  找一个最优点 将两边分开 得到这个区间最优值 

poj 2955

题意:最大的括号匹配

思路:要么合并区间,要么判断区间两个端点是否合法,dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2)

<pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
#define maxn 105
char ch[maxn];
int dp[maxn][maxn];

bool judge(char c1,char c2)
{
if(c1=='('&&c2==')')
return true;
if(c1=='['&&c2==']')
return true;
return false;
}

int main()
{
while(scanf("%s",ch))
{
if(strcmp(ch,"end")==0)break;
memset(dp,0,sizeof(dp));

for(int i=1;ch[i];i++)
{
for(int j=0;ch[j+i];j++)
{
for(int k=j;k<i+j;k++)
{
dp[j][j+i]=max(dp[j][j+i],dp[j][k]+dp[k+1][i+j]);
if(judge(ch[j],ch[i+j]))
{
dp[j][j+i]=max(dp[j][j+i],dp[j+1][j+i-1]+2);
}
}
}
}

int len=strlen(ch);
printf("%d\n",dp[0][len-1]);
}
return 0;
}




 hdu 2476

这题其实本来已经想到但是又被自己否决 -  =!! 好气啊!!后来看了一下别人的第一句思路,就后悔死了~~~

题意:给出两串字符,要你将第一串字符变成第二串字符,每次可以改变连续的一个或多个字符,求最少的修改次数

(题意就直接黏贴别人的吧)

思路:首先得出凭空构造第二个串任意一个区间需要多少,到底需要多少步骤。得出以后枚举区间每一个点,是否和原来的相等,如果相等的话  

dp[j][i+j]=min(dp[j][i+j],dp[j][k-1]+dp[k+1][i+j]);

(i-i+j  k 是分隔点)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
#define maxn 105

char ch1[maxn],ch2[maxn];
int dp[maxn][maxn];

int main()
{
while(scanf("%s%s",ch1,&ch2)!=EOF)
{
memset(dp,0x3f,sizeof(dp));
int len=strlen(ch1);

for(int i=0;i<len;i++)
{
dp[i][i]=1;
}

for(int i=1;i<len;i++)
{
for(int j=0;i+j<len;j++)
{
for(int k=j;k<i+j;k++)
{
dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k+1][i+j]);
if(ch2[j]==ch2[i+j])
{
dp[j][i+j]=min(dp[j][i+j],dp[j][i+j-1]);
dp[j][i+j]=min(dp[j][i+j],dp[j+1][i+j]);
}
}
}
}

for(int i=0;i<len;i++)
{
for(int j=0;i+j<len;j++)
{
for(int k=j;k<=i+j;k++)
{
dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k+1][i+j]);
if(ch1[k]==ch2[k])
{
if(i==0)
dp[j][j]=0;
else
{
dp[j][i+j]=min(dp[j][i+j],dp[j][k-1]+dp[k+1][i+j]);
}
}

}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  区间dp