hdu 2476 String painter (区间dp)
2014-11-29 13:57
483 查看
记得好像在网络赛中看到过,可惜不会做。感觉对区间dp中像这种匹配的问题特别不擅长0.0。枚举长度dp,首先考虑空白串变到第二个串的最小步数,然后在一维dp一下从第一个串变到第二个串的最小步数。为什么这样做呢?想想如果直接从第一个串变到第二个串容易吗?是不是想不到很好的办法实现?
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<vector> using namespace std; typedef __int64 lld; #define oo 0x3f3f3f3f #define Mod 10007 #define oo 0x3f3f3f3f #define maxn 1005 int dp[maxn][maxn];//前i个数分成j个区间能得到的最小值 int d[maxn]; char str[maxn],s[maxn]; int main() { int n; while(scanf("%s %s",s+1,str+1)!=EOF) { n=strlen(str+1); memset(dp,0,sizeof dp); for(int L=1;L<=n;L++) { for(int i=1;i+L-1<=n;i++) { int j=i+L-1; dp[i][j]=dp[i+1][j]+1; for(int k=i+1;k<=j;k++) if(str[i]==str[k]) dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]); } } for(int i=1;i<=n;i++) d[i]=dp[1][i]; for(int i=1;i<=n;i++) { if(s[i]==str[i]) d[i]=d[i-1]; else { for(int j=i-1;j>=0;j--) d[i]=min(d[i],d[j]+dp[j+1][i]); } } printf("%d\n",d ); } return 0; }
相关文章推荐
- HDU 2476 String painter(区间dp)
- hdu 2476 String painter 区间dp
- hdu 2476 String painter(区间dp)
- HDU 2476 String painter(区间DP)
- HDU 2476 String painter(区间DP)
- HDU 2476 String painter(区间DP啊)
- HDU 2476 String painter 区间dp
- 【HDU 2476】String Painter(区间DP)
- Hdu 2476 String painter(区间dp)
- HDU 2476 String painter 区间dp
- hdu 2476 String painter(区间DP,较难)
- hdu 2476 String painter(区间dp)
- HDU 2476 String painter(区间DP)
- HDU 2476 String painter(区间dp)
- HDU 2476 String painter(区间DP)
- hdu 2476 String painter 区间dp
- HDU 2476 | UVALive 4394 - String painter (区间DP)
- HDU 2476 String painter(区间dp)
- HDU 2476 String painter(区间DP)
- HDU 2476 String painter 刷字符串(区间DP)