T3:DP(基于排列组合思想的状态转移)

其实之前写排列组合的题目有一种很茫然的感觉....

应该是因为之前没有刷过所以没有什么体会

上次刷的vj1060有用到,但是写状态转移还是第一次学习吧

ccy大神的题解如果认真去思考的话很容易看懂...感觉他写得太详细了,以至于自己都不想自己敲题解了

附上代码和注释再说说自己的感受吧:

1先判断出这个序列是否可行,不可行就输出无解,若可行那么做步骤2,3计算。

2递推出有i个灯时的所有状态数(无论可行不可行)状态表示:f[i,j,k]:表示i个灯,绿,红灯的奇偶性为j,k时的所有状态数。奇为0,偶为1
f[i,0,0] = f[i-1,1,0]+f[i-1,0,1]+f[i-1,0,0];
f[i,0,1] = f[i-1,1,1]+f[i-1,0,0]+f[i-1,0,1];
以此类推.......(不要害怕我会给大家详细解释)
3根据现有的序列按字典序累加答案。 然后我给大家解释一下吧
其状态可以说是明白的
f[i,j,k]就和他说的那样表示i个灯,j表示绿灯的个数的奇偶性,k是红灯的个数的奇偶性
(其中0 表示x灯的个数为奇数,1表示x灯的个数为偶数)
大家不要着急看程序:看我给诸位推一推边界(这些都是很有用的);
先讨论一个灯的时候
我们有
f[1,0,0]=0;表示灯的个数为1,绿灯的个数为奇数,红灯的个数也为奇数的状态,当然这是可能的,因为有了一个绿灯那么另外一个就不是奇数了,也就是说无论如何都不可能在1的时候出现这种情况,所以赋值为0表示这种情况的方案数为0
f[1,1,0]=1;表示灯的个数为1,绿灯的个数为偶数,红灯的个数为奇数,这时候有一种情况就是一个灯,而这个灯是红灯(奇数),这时绿灯的个数为0(奇数);
f[1,0,1]=1;表示灯的个数为1,绿灯的个数为奇数,红灯的个数为偶数,这时候有一种情况就是绿灯有一个(奇数),红灯为0(偶数);
f[1,1,1]=1;表示灯的个数为1,绿灯的个数为偶数,红灯的个数为偶数,这时候有一种情况就是这灯是黄色的;这样红灯和绿灯的个数都为0(偶数) 接下来开始讨论两个灯的时候
首先按照方程的第一和第二行,我们有
f[2,0,0]:=f[1,1,0]+f[1,0,1]+f[1,0,0] ······④
即两个灯,绿灯的个数为奇数,红灯的个数为奇数的方案数
其会等于一个灯的情况:(我按照顺序给出一个灯的情况)
①Red即f[1,1,0]要达到f[2,0,0]只需要变成Red,Red即可即两个红灯
②Green即f[1,0,1]要达到f[2,0,0]只需要变成green,green即可即两个绿灯
③这个起到的是递推作用,虽然现在f[1,0,0]是0,但是f[2,0,0]明细不是0了
那么假如我们现在是在推第3个那么f[3,0,0]:=f[2,1,0]+f[2,0,1]+f[2,0,0]的情况了这个时候f[2,0,0]是两个等都是奇数的情况,
此时加上一个yellow就变成f[3,0,0]了而且也只能这样,这样就更证明了方程的正确性,对于前面的①和②也是如此,都可以证明这种状态只能从那种状态转移过来
剩下的三个方程将在程序中给出,其方程都可以由自己推出;
目的是为了将f[2,0,1],f[2,1,0],f[2,1,1]都得推出来。以及f[n,....] 好了我们切入算法部分
初始时ans:=1;//我们要找的是比它的序列先的序列.所以找到的序列数应该加一
对于样例
RGYR
我们要从字典序出发G->R->Y;
好的
R前面有G
那么我们转化成
R???的形式
很显然我们要加入一个灯数为3的xxx(未知排列)
这个排列应该满足整个序列仍然满足绿奇、红偶.
那么ans就应该加上f[3,0,0]表示加入一个绿灯为奇数的,红灯为奇数的序列(长度为3)
因为序列中已知部分只有R一个(R是奇数,但是其要偶数,红偶);所以要加上一个奇数(奇数+奇数=偶数)
而已知部分中G为0个,所以要加上一个奇数(偶数+奇数=奇数,绿奇);
然后G就没有了,它的下一个就是R了
然后是RG???,对于G来说它的字典序是最小的所以跳过
然后是RGY?,对于Y来说它的字典序前面还有R和G
那么先讨论G的情况(当然这两个情况可以同时讨论)
RGG?->因为G(绿)为偶数,而绿要奇数,所以加上f[1,0,y],y是什么呢?相信大家都会了,思考一下吧
然后是
RGR?->因为这是G是奇数所以加上偶数,即加上f[1,1,y],y还是由读者思考
var
i,j,n,a,b,g,r:longint;
ans:int64;
f:array[0..100001,0..1,0..1]of longint;
s:ansistring; procedure go_1;
begin
g:=g+1;
if (odd(g)) and (not odd(r)) then//根据g和r的奇偶性处理相应问题
ans:=(ans+f[n-i,1,1]) mod 12345;
if (odd(g)) and (odd(r)) then
ans:=(ans+f[n-i,1,0]) mod 12345;
if (not odd(g)) and (not odd(r)) then
ans:=(ans+f[n-i,0,1]) mod 12345;
if (not odd(g)) and (odd(r)) then
ans:=(ans+f[n-i,0,0]) mod 12345;
g:=g-1;//用完g后要注意删掉
end; begin
readln(n);
readln(s);
fillchar(f,sizeof(f),0);
f[1,0,1]:=1;
f[1,1,1]:=1;
f[1,1,0]:=1;
f[1,0,0]:=0;
for i:=2 to n do
begin
f[i,0,0]:=(f[i-1,0,0]+f[i-1,0,1]+f[i-1,1,0])mod 12345;
f[i,0,1]:=(f[i-1,0,1]+f[i-1,1,1]+f[i-1,0,0])mod 12345;
f[i,1,0]:=(f[i-1,0,0]+f[i-1,1,0]+f[i-1,1,1])mod 12345;
f[i,1,1]:=(f[i-1,1,1]+f[i-1,1,0]+f[i-1,0,1])mod 12345;//这是另外4个递推式 要注意mod
end;
ans:=1;//一开始ans=1具体为什么我上面有解释
g:=0;r:=0;
for i:=1 to n do
case s[i] of
'G':inc(g);//字典序是最小的了所以不需要处理,直接增加g的数目
'R':begin
go_1;//go_1是处理G的情况 因为R前面的字典序只有一个所以只要处理一个
inc(r);//r的数目加1
end;
'Y':begin
go_1;//先处理G的情况 因为Y的字典序前面有G,R,所以还要处理R
inc(r);//inc(R)用完之后要注意减掉
if (odd(g)) and (odd(r)) then//这是根据当前g和r的数目做我上所述的相应操作
ans:=(ans+f[n-i,1,0]) mod 12345;
if (odd(g)) and (not odd(r)) then
ans:=(ans+f[n-i,1,1]) mod 12345;
if (not odd(g)) and (not odd(r)) then
ans:=(ans+f[n-i,0,1]) mod 12345;
if (not odd(g)) and (odd(r)) then
ans:=(ans+f[n-i,0,0]) mod 12345;
dec(r);
end;
end;
if not odd(g) or odd(r) then writeln('invalid') else//如果不满足要求输出无解信息,否则输出ans
writeln(ans);
end.

1.像g++,然后讨论完之后g--,这样的操作,前者是用来判断之后是加上奇或偶,而为什么要再减一呢?别忘了g是用来统计green的个数的,要用来判断输入样例是否合法,当然要使g的个数不变了;

2.感觉最重要的是要有排列组合的思想,推出边界条件很重要,推出状态转移方程很重要;

3.在计算f的时候要记得mod 12345

Day2:T3DP(基于排列组合思想)的更多相关文章

  1. POJ1644状态转移的思想——排列组合

    m个物品放n个盒子,盒子物品都相同,问你放的方法总数是多少 看着像个排列组合,算着算着就发现我排列组合都忘得差不多啦,哎,什么时候能打败遗忘呢 然后想用dp做,但是转移的方面没有想好 看了看题解感觉这 ...

  2. iOS多线程中,队列和执行的排列组合结果分析

    本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...

  3. 排列 && 组合

    最近编程经常遇到需要 排列&&组合(求子集) 的问题:遂整理一下. 1. 数字的排列与组合(递归):O(n!),O(nC(n,k)) * O(n) #include <stdio ...

  4. js 排列 组合 的一个简单例子

    最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比 ...

  5. [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)

    2018年01月03日阅读 2472   [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想) LYEmptyView 此框架是本人在5,6个月前,公司启动新项目的时候, ...

  6. 【LeetCode每天一题】Permutations(排列组合)

    Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...

  7. 【专题】计数问题(排列组合,容斥原理,Prufer序列)

    [容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交 ...

  8. 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT

    [题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...

  9. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

随机推荐

  1. 1023 Train Problem II(卡特兰数)

    Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want ...

  2. 【Linux】Vim编辑器-批量注释与反注释

    [-] vim编辑器---批量注释与反注释 方法一 块选择模式 插入注释 取消注释 方法二 替换命令 批量注释 取消注释 实例演示   vim编辑器---批量注释与反注释 在使用vim编写代码的时候, ...

  3. iOS开发分析&quot;秘密&quot;App内容页面的效果(两)

    @我前几天写的"秘密"的Cell制品的效果,想要的效果还是有差距,并且扩展性非常不好,于是重写封装,把总体视图都放到scrollView中,基本是和secret app 一模一样的 ...

  4. maven+hudson构建集成测试平台

     1.下载hudson.war.2.命令行运行:java -jar hudson.war --httpPort=8070 -Dorg.eclipse.jetty.util.URI.charset=GB ...

  5. SVN提交忽略*.class、.classpath、.mymetadata、.project、.settings、.myeclipse和其他非版本控制文件

    1.忽略*.class 在TortoiseSVN -->setting(设定)--规设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrZTY ...

  6. win7安装ruby on rails开发环境

    前言 我们看到很多文章说ruby环境windows它是非常困难的基础上,这将是各种稀奇古怪的问题,因此,建议linux和mac发. 可是我依照教程搭了下,问题也不算太多.总过大概花费了2个半小时左右就 ...

  7. json 解析解乱码

    1. 该法的字符编码: 串店txt文档文档都有自己的编码,例如utf-8,ansi等待,但当 存款txt文件.其编码将和txt编码文件本身一致.  例如,之前的字符编码ansi.txt该文件的编码是u ...

  8. asp.net 操作XML

    using System.Xml; using System.Data; using System.IO;   string xmlpath = HttpRuntime.AppDomainAppPat ...

  9. Android在真机调试的设置方法

    1. 设置android手机为USB调试模式.步骤: menu---> 设置 ---> 应用程序 ---> 开发 , 选择[USB调试] 2. 用USB连接手机和电脑,并确保成功.步 ...

  10. unity资源

    unity资源集中贴 1.unity经验之谈 http://jingyan.baidu.com/article/19192ad820f17be53e570715.html 2.百度网盘,分享了一点模型 ...