首页 > 代码库 > hdu_2476_String painter(区间DP)
hdu_2476_String painter(区间DP)
题目链接:hdu_2476_String painter
题意:
有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次
题解:
考虑区间dp[i][j],表示从第i到第j最少需要刷的次数。这里要先算从空串到b的dp,然后根据这个来推a串到b串的最小次数。
因为如果a的整个区间需要重新构造,这个区间就相当于空串。状态转移方程具体看代码
1 #include<cstdio> 2 #include<cstring> 3 #define F(i,a,b) for(int i=a;i<=b;i++) 4 5 const int N=107; 6 char a[N],b[N]; 7 int dp[N][N],ans[N]; 8 9 inline void up(int &a,int b){if(a>b)a=b;}10 11 int main()12 {13 while(~scanf("%s%s",a+1,b+1))14 {15 int n=strlen(a+1);16 memset(dp,0,sizeof(dp));17 F(i,1,n)dp[i][i]=1;18 F(l,1,n-1)F(i,1,n-l)19 {20 int j=i+l;21 dp[i][j]=dp[i+1][j]+1;22 F(k,i+1,j)if(b[i]==b[k])up(dp[i][j],dp[i+1][k]+dp[k+1][j]);23 }24 F(i,1,n)ans[i]=dp[1][i];25 F(i,1,n)if(a[i]==b[i])ans[i]=(i==1?0:ans[i-1]);26 else F(j,1,i-1)up(ans[i],ans[j]+dp[j+1][i]);27 printf("%d\n",ans[n]);28 }29 return 0;30 }
hdu_2476_String painter(区间DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。