原题链接:填数字

顺便推荐一下,偶然看到这个OJ,发现社区运营做得很赞,而且交互和编译环境都很赞(可以编译包括Python,Ruby,Js在内的脚本语言,也可以编译新标准的C/C++11,甚至包括Go和C Sharp等),虽然暂时不太火,但估计会逐渐成为国内算法界非常受欢迎的OJ社区。

主页:http://www.51nod.com/index.html


  

  本题是个题意简单的,思路复杂的DP题,说实话,光是想出这种DP就已经非常不易了,即便写出来也要考虑清楚每一种转移的公式和数值关系。

  

  原题:有n(1-200)行格子,第i(1<=i<=n)行有i个格子,每行格子是左对齐。现在要在每一个格子填入一个非负整数,最后使得每一行每一列的和都不超过2。

     请计算有多少种方案,答案比较大,请输出对100,000,007(1e8+7)取余后的结果。

     下图是n=4的时候格子的摆放。

      

 //务必注意理清每次状态转移方程的思路和公式
//博主因为一个地方写多了个+1,结果WA了5发....
//Memory:34900K Time:93Ms
#include<iostream>
using namespace std; #define MAX 201
#define MOD 100000007 #define COL_0 (i - j - k - 1) //和为0的列数
/*
* dp[i][j][k]
* i:表明当前行
* j:表明i行完成时有多少列为1
* k:表明j行完成时有多少列为2
* dp值表明该状态下的情况数
* 每次由 i-1行 -> i行 转移同j同k的状态
*/
__int64 dp[MAX][MAX][MAX]; int main()
{
int n;
scanf("%d", &n);
dp[][][] = dp[][][] = dp[][][] = ;
for (__int64 i = ; i <= n; i++)
for (__int64 j = ; j <= i; j++)
for (__int64 k = ; k <= i - j; k++)
{
//最后一格为0时
//-可+2
if (i - j - k - >= )
dp[i][j][k + ] = (dp[i][j][k + ] + dp[i - ][j][k] * COL_0) % MOD;
//-可+1
//--两个1_0-0
if (i - j - k - >= )
dp[i][j + ][k] = (dp[i][j + ][k] + dp[i - ][j][k] * (COL_0 * (COL_0 - ) / )) % MOD;
//--两个1_1-0
if (j >= && i - j - k - >= )
dp[i][j][k + ] = (dp[i][j][k + ] + dp[i - ][j][k] * COL_0 *j) % MOD;
//--两个1_1-1
if (j >= )
dp[i][j - ][k + ] = (dp[i][j - ][k + ] + dp[i - ][j][k] * (j*(j - ) / )) % MOD;
//--一个1_1
if (j >= )
dp[i][j - ][k + ] = (dp[i][j - ][k + ] + dp[i - ][j][k] * j) % MOD;
//--一个1_0
if (i - j - k - >= )
dp[i][j + ][k] = (dp[i][j + ][k] + dp[i - ][j][k] * COL_0) % MOD;
//什么都不加
dp[i][j][k] = (dp[i][j][k] + dp[i - ][j][k]) % MOD; //最后一格为1时
//-可+1_0
if (i - j - k - >= )
dp[i][j + ][k] = (dp[i][j + ][k] + dp[i - ][j][k] * COL_0) % MOD;
//-可+1_1
if (j >= )
dp[i][j][k + ] = (dp[i][j][k + ] + dp[i - ][j][k] * j) % MOD;
//什么都不加
dp[i][j + ][k] = (dp[i][j + ][k] + dp[i - ][j][k]) % MOD; //最后一格为2时
dp[i][j][k + ] = (dp[i][j][k + ] + dp[i - ][j][k]) % MOD;
} __int64 sum = ;
for (int j = ; j <= n; j++)
for (int k = ; k <= n - j; k++)
sum = (sum + dp[n][j][k]) % MOD;
printf("%I64d\n", sum); return ;
}

ACM/ICPC 之 DP进阶(51Nod-1371(填数字))的更多相关文章

  1. 51NOD 1371填数字

    传送门 分析 此题关键在于想出dp[i][j][k]代表考虑到第i行,还能放1的的共有j列,还能放2的共有k行.之后就枚举每一行是没有还是1个1还是2个1还是1个2,然后转移即可. 代码 #inclu ...

  2. ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)

    //POJ3377 //DP解法-解有规律的最短路问题 //Time:1157Ms Memory:12440K #include<iostream> #include<cstring ...

  3. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  4. 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

    odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  6. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  7. ACM ICPC Kharagpur Regional 2017

    ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...

  8. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

  9. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

随机推荐

  1. Redis 分布式session

    这里有三种和方式实现: 1.Harbour.RedisSessionStateStore , ServiceStack.Redis 配置web.config <sessionState mode ...

  2. fedora各个版本的下载地址archive

    archive: ['a:kaiv] she went to the city archive this morning. ==================== === fedora 的下载地址是 ...

  3. 黄永成-thinkphp讲解-个人博客讲解25集

    整个网站的根目录用blog你要跟别人说起,自己好识别的文件夹名字. 下面的项目名称 就不再重复的写了, 直接用App就好了. 网站访问: ...../index.php(入口文件)/Admin(模块名 ...

  4. 浙大PAT-1002

    1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式 ...

  5. 2015年12月12 Node.js实战(一)使用Express+MongoDB搭建多人博客

    序,Node是基于V8引擎的服务器端脚本语言. 基础准备 Node.js: Express:本文用的是3.21.2版本,目前最新版本为4.13.3,Express4和Express3还是有较大区别,可 ...

  6. dwz 在dialog里打开dialog

    需要在打开dialog里再弹出一个dialog的话,需要在打开第一个dialog的地方指定rel,这样就可以弹出第二个dialog而不是替换掉第一个dialog <a class="a ...

  7. 关于学习session的一二

    session作为一种服务器端技术,在网页中与cookie相配合可谓相得益彰,今天学习了进一步session的相关知识,在这里记录一二,以便于以后查阅 /*问题:当我们浏览网页的时候,张三和李四可以购 ...

  8. c#后台替换html标签的方法

     public static string ReplaceHtmlTag(string html)         {              string strText = System.Tex ...

  9. Android4.4 往短信收件箱中插入自定义短信(伪造短信)

    这段时间稍微有点空闲,把前一段学习Android做过的一些小项目整理整理.虽然没有什么工程量很大的项目,但是对于一个新手,解决这些问题还是花了一段时间.感觉还是非常有记录的意义呢~~~么么哒*—* 今 ...

  10. debian8 配置使用 nfs

    操作过的步骤: 1.dpkg-reconfigre rpcbind. 2.在终端上退出要挂载的目录. 错误:mount -t nfs 172.16.0.121:/home/junda /mnt,出现以 ...