BZOJ4384: [POI2015]Trzy wieże 记忆化搜索
2017-06-28 21:16
211 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=4384
dp数组表示的是当前有两个数量相等,末尾字符是这两个中的一个且与它前面的字符不等,第三种的数量比这两个少1的情况。主要是基本相同的代码抄三遍所以看着比较长。。。时间复杂度o(n)。
dp数组表示的是当前有两个数量相等,末尾字符是这两个中的一个且与它前面的字符不等,第三种的数量比这两个少1的情况。主要是基本相同的代码抄三遍所以看着比较长。。。时间复杂度o(n)。
#include<cstdio> #include<algorithm> #define gm 1000005 using namespace std; int n,ans,pre[gm],suf[gm],dp[gm][3]; char s[gm]; int dfs(int pos,int a,int b,int c) { if(pos<=1) return 1; if(a==b&&b==c&&a==c) { if(s[pos]=='S') goto S; if(s[pos]=='B') goto B; if(s[pos]=='C') goto C; } if(a==b) { if(s[pos]=='S'||s[pos]=='B') { if(a!=c+1) return pos-1; if(pre[pos]>1) return pos-2; if(dp[pos][0]) return dp[pos][0]; return dp[pos][0]=dfs(pos-1,a-(s[pos]=='S'),b-(s[pos]=='B'),c); } C: return dfs(pos-pre[pos],a,b,c-pre[pos]); } if(b==c) { if(s[pos]=='B'||s[pos]=='C') { if(b!=a+1) return pos-1; if(pre[pos]>1) return pos-2; if(dp[pos][1]) return dp[pos][1]; return dp[pos][1]=dfs(pos-1,a,b-(s[pos]=='B'),c-(s[pos]=='C')); } S: return dfs(pos-pre[pos],a-pre[pos],b,c); } if(a==c) { if(s[pos]=='S'||s[pos]=='C') { if(c!=b+1) return pos-1; if(pre[pos]>1) return pos-2; if(dp[pos][2]) return dp[pos][2]; return dp[pos][2]=dfs(pos-1,a-(s[pos]=='S'),b,c-(s[pos]=='C')); } B: return dfs(pos-pre[pos],a,b-pre[pos],c); } return pos; } int m 4000 ain() { scanf("%d",&n); fread(s,1,n+1,stdin); int a=0,b=0,c=0; for(int i=1;i<=n;++i) pre[i]=s[i-1]==s[i]?pre[i-1]+1:1,++(s[i]=='B'?b:s[i]=='C'?c:a); for(int i=n;i;--i) suf[i]=s[i+1]==s[i]?suf[i+1]+1:1; for(int i=1;i<=n;++i) ans=max(ans,max(suf[i],dfs(n,a,b,c)-i+1)),--(s[i]=='B'?b:s[i]=='C'?c:a); printf("%d\n",ans); return 0; }
相关文章推荐
- bzoj 4384: [POI2015]Trzy wieże 树状数组
- 【BZOJ4384】[POI2015]Trzy wieże 树状数组
- BZOJ4384: [POI2015]Trzy wieże
- BZOJ4384 POI2015 Trzy wieże
- BZOJ4384 : [POI2015]Trzy wieże
- BZOJ 4384: [POI2015]Trzy wieże
- BZOJ4384[POI2015] Trzy wieże
- BZOJ4384: [POI2015]Trzy wieże
- [POI2015]Trzy wieże
- [BZOJ4383][POI2015]Pustynia (拓扑排序)
- [BZOJ3747][POI2015]Kinoman
- 【bzoj3747】[POI2015]Kinoman 线段树区间合并
- BZOJ 3750: [POI2015]Pieczęć 【模拟】
- BZOJ 4385: [POI2015]Wilcze doły 单调队列
- bzoj 3747: [POI2015]Kinoman
- BZOJ4380 POI2015 Myjnie
- 【BZOJ4428】[Nwerc2015]Debugging调试 记忆化搜索+分块
- 【bzoj3747】【POI2015】【Kinoman】【线段树】
- [bzoj3747][POI2015]Kinoman_线段树
- bzoj 4386: [POI2015]Wycieczki 矩阵乘法&倍增