[DP] ZROI 2017提高 5 T2. 石头剪刀布
2017-10-07 20:56
295 查看
杜老师的好题。考虑一个暴力的 DP : f[i][p0][p1][p2] 表示序列前 i 个元素,分别以 0,1,2 为结尾的最长胜利子序列长度。简单的转移。这样复杂度是O(n4) 的,怎么优化呢?
考虑到 p0,p1,p2 之间的差是很小的。因为可以在子序列头上删一两个得到以其他为结尾的子序列。在分析一下发现差不会超过 2 。然后就发现有用的状态只有 O(n2) 。就做好了。
这种减少冗余状态的思路很好。记得上次做过一题,求把给定串变成回文需要删的最小字符数,若删超过k个,就输出Fail ,也是这种思路。就是求原串和反串的最长公共子序列时,i,j的差不必超过 k 这样可以 O(nk) 出解。
还需要多做题。
考虑到 p0,p1,p2 之间的差是很小的。因为可以在子序列头上删一两个得到以其他为结尾的子序列。在分析一下发现差不会超过 2 。然后就发现有用的状态只有 O(n2) 。就做好了。
这种减少冗余状态的思路很好。记得上次做过一题,求把给定串变成回文需要删的最小字符数,若删超过k个,就输出Fail ,也是这种思路。就是求原串和反串的最长公共子序列时,i,j的差不必超过 k 这样可以 O(nk) 出解。
还需要多做题。
#include<cstdio> #include<cstring> using namespace std; const int maxn=2015,MOD=998244353; int n,f[maxn][maxn][4][4],ans[maxn]; bool a[maxn][3]; inline int max(int x,int y){ return x>y?x:y; } int main(){ freopen("zroi5B.in","r",stdin); freopen("zroi5B.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ char st[5]; scanf("%s",st); int len=strlen(st); for(int j=0;j<=len-1;j++) a[i][st[j]-'0']=true; } f[0][0][0+2][0+1]=1; for(int i=0;i<=n-1;i++) for(int p0=0;p0<=i;p0++) for(int j1=-2;j1<=1;j1++) if(0<=p0+j1&&p0+j1<=i) for(int j2=-1;j2<=2;j2++) if(0<=p0+j2&&p0+j2<=i) if(f[i][p0][j1+2][j2+1]){ int p1=p0+j1, p2=p0+j2; if(a[i+1][0]) (f[i+1][max(p0,p2+1)][p1-max(p0,p2+1)+2][p2-max(p0,p2+1)+1]+=f[i][p0][j1+2][j2+1])%=MOD; if(a[i+1][1]) (f[i+1][p0][max(p1,p0+1)-p0+2][p2-p0+1]+=f[i][p0][j1+2][j2+1])%=MOD; if(a[i+1][2]) (f[i+1][p0][p1-p0+2][max(p2,p1+1)-p0+1]+=f[i][p0][j1+2][j2+1])%=MOD; } for(int p0=0;p0<=n;p0++) for(int j1=-2;j1<=1;j1++) if(p0+j1>=0) for(int j2=-1;j2<=2;j2++) if(p0+j2>=0) (ans[max(max(p0,p0+j1),p0+j2)]+=f [p0][j1+2][j2+1])%=MOD; for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- [DP] ZROI 2017 提高6 T2 异或统计
- [DP] ZROI 2017提高1 T2.给 Ca
- [DP] ZROI 2017 提高3 T3 建筑
- [数位DP] ZROI 2017 提高3 T1 树状数组
- [补集转化 DP] ZROI 2017提高7 强军战歌
- jzoj5408 【NOIP2017提高A组集训10.21】Dark (巧设状态的DP)
- 2017年10月23日提高组T2 灵知的太阳信仰 单调队列优化dp
- 【ZJOI2017 Round1练习】D8T2 sequence(DP)
- 【NOIP 2010 提高组 T2】乌龟棋(DP)
- JZOJ5377. 【NOIP2017提高A组模拟9.19】开拓 DP
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字 数位DP
- SSL2812 2017年10月30日提高组T2 凤凰院凶真(dp,LCIS)
- SSL2841 2017年11月7日提高组T2 好路线(dp)
- SSL2674 2017年8月9日提高组T2 覆盖(dp)
- [表达式求值 矩阵乘法] ZROI 2017提高10A. Calc
- SSL2759 2017年10月6日提高组T2 挖矿(dp)
- [高维前缀和] ZROI 2017提高2 World Of Our Own
- 【JZOJ5336】【NOIP2017提高模拟】提米树(DP、前缀和)
- JZOJ5416. 【NOIP2017提高A组集训10.22】密码 DP
- [数学杂题 位运算] ZROI 2017 提高6 T1 异或统计