码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj1068]压缩[区间动规]

时间:2016-04-10 21:02:26      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

看了lujiaxin的blog,感觉自己好浪啊。。。。好难过

刷题的时候不够投入,每种算法都是只写一两道就过去了,这样怎么可能进步嘛

不要总是抱怨时间太少了 都是自己不努力>_<

好啦 看题

n<=50的范围,记忆化。。。N^3

f[a][b][t]表示a~b这段区间内,有没有M的最短答案。

枚举断点(很重要的思想),当T==1,显然左边右边都dp一下;(think clearly)

然后,看看左边能不能被压缩,这一句很重要,因为如果区间内没有M的话,它只能是最左边复制呀复制,所以可以保证正确性;

标算思路好严谨啊,感觉自己DP能力还要多学习

PS.submit的时候看到别人在做3110,代码真心很短的树套树,好想写啊~

月考加油啦~\(≧▽≦)/~

 

技术分享
#include<cstdio>
#include<algorithm>
#include<cstring>
char s[200];int f[60][60][2],mark[60][60][2];
using namespace std;
bool same(int a,int b)
{
  int l=b-a+1;if(l%2==1)return 0;
  for(int i=a;i<=(a+b)/2;i++)
   if(s[i]!=s[i+l/2])return 0;
  return 1; 
}
int dp(int a,int b,int t)
{
  int tmp=b-a+1,l=b-a+1;if(tmp==1)return 1;
  if(mark[a][b][t])return f[a][b][t];mark[a][b][t]=1;
  if(t>0)for(int i=a;i<b;i++)tmp=min(tmp,dp(a,i,1)+dp(i+1,b,1)+1);
  for(int i=a;i<b;i++)tmp=min(tmp,dp(a,i,t)+b-i);
  if(same(a,b))tmp=min(tmp,dp(a,(a+b)/2,0)+1);
  f[a][b][t]=tmp;return tmp;
}
int main()
{
  scanf("%s",s+1);
  int len=strlen(s+1);
  printf("%d",dp(1,len,1)); 
}
View Code

 

[bzoj1068]压缩[区间动规]

标签:

原文地址:http://www.cnblogs.com/wxxlouisa/p/5375312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!