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. boadWorld Mark!

    2014-11-21 xiazaiba.com>jiaocheng>972.html

  2. wp如何代码实现锁屏

    原文:wp如何代码实现锁屏 由于wp系统对开发者相对封闭,造成了用户对那些稍有用处但又不那么有用的功能过度追求,比如说重启.锁屏等功能.针对一个功能写两行代码,再起一个牛逼哼哼的名字,就可以获得超级多 ...

  3. Controller和View的交互

    Controller和View的交互 目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI ...

  4. 详细的图文介绍如何利用XAMPP本地建站的环境配置教程

    原文:详细的图文介绍如何利用XAMPP本地建站的环境配置教程 WordPress 是一个简便快捷,用途广,人气旺的一个开源的博客建站程序.很有很多等您去发现. 简便快捷:在性能上易于操作.易于浏览: ...

  5. Webbrowser控件史上最强技巧全集

    原文:Webbrowser控件史上最强技巧全集 Webbrowser控件史上最强技巧全集 VB调用webbrowser技巧集 1.获得浏览器信息: Private Sub Command1_Click ...

  6. IOS数组排序等

    一.UITextField的代理方法 #pragma mark 当文本框开始编辑的时候调用---开始聚焦 - (void)textFieldDidBeginEditing:(UITextField * ...

  7. 欧几里德欧几里德原理和扩展的原则,(Euclidean Theory and Extended Euclidean Theory)学习笔记

    题记:这是我第四次审查扩展欧几里德原理,由于不经常使用.当你想使用,可以不记得细节,经常检查信息,所以,简单地梳理这一原则和扩展欧几里德的原则,以博客存档以备查用. 一个.欧几里德原理 欧几里德原理( ...

  8. AngularJS html5Mode与ASP.NET MVC路由

    AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...

  9. [Unity-7] Update和FixedUpdate

    1.Update和FixedUpdate这是Unity既用内提供的帧功能接口相关联. Update():这个函数里面的内容每一帧都会被运行一次.这个函数有一个特点,那就是运行的频率等于帧率.而这个帧率 ...

  10. 【android】WebView缓存数据收集

    Android WebView 缓存 Android高手进阶教程(二十四)之---Android WebView的缓存!!! Android webView 缓存 Cache + HTML5离线功能 ...