hdu 4055(经典问题)
总是不能正确的将一个大问题变成子问题,而且又找不到状态转移方程。 直接导致这题想了5个小时最后还是无果。。。
谨记!
Number String
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1136 Accepted Submission(s): 503
Your task is as follows: You are given a string describing the signature of many possible permutations, find out how many permutations satisfy this signature.
Note: For any positive integer n, a permutation of n elements is a sequence of length n that contains each of the integers 1 through n exactly once.
Each test case occupies exactly one single line, without leading or trailing spaces.
Proceed to the end of file. The '?' in these strings can be either 'I' or 'D'.
ID
DI
DD
?D
??
2
2
1
3
6
Permutation {1,2,3} has signature "II".
Permutations {1,3,2} and {2,3,1} have signature "ID".
Permutations {3,1,2} and {2,1,3} have signature "DI".
Permutation {3,2,1} has signature "DD".
"?D" can be either "ID" or "DD".
"??" gives all possible permutations of length 3.
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 1100
#define MOD 1000000007 char g[N];
int dp[][N]; int main()
{
while(scanf("%s",g)!=EOF)
{
memset(dp,,sizeof(dp));
int a=,b=;
int len=strlen(g);
dp[a][]=;
int ti=;
for(int i=;i<=len+;i++)
{
for(int j=;j<=i;j++)
{
if(g[ti]=='I')//以j结尾的。 所有情况
{
dp[b][j] = (dp[b][j]+dp[a][j-]);
if(dp[b][j]>=MOD) dp[b][j]-=MOD;
if(dp[b][j]<) dp[b][j]+=MOD;
}
else if(g[ti]=='D')
{
dp[b][j]= (dp[b][j]+dp[a][i-]-dp[a][j-]);
if(dp[b][j]>=MOD) dp[b][j]-=MOD;
if(dp[b][j]<) dp[b][j]+=MOD;
}else
{
dp[b][j]= (dp[b][j]+dp[a][i-]);
if(dp[b][j]>=MOD) dp[b][j]-=MOD;
if(dp[b][j]<) dp[b][j]+=MOD;
}
}
swap(a,b);
for(int j=;j<=i;j++)
{
dp[b][j]=;
dp[a][j]=(dp[a][j]+dp[a][j-]);
if(dp[a][j]>=MOD) dp[a][j]-=MOD;
if(dp[a][j]<) dp[a][j]+=MOD;
}
ti++;
}
//for(int i=1;i<=len+1;i++)
// ans= (ans+dp[a][i])%MOD;
printf("%d\n",(dp[a][len+]%MOD+MOD)%MOD);
}
return ;
}
hdu 4055(经典问题)的更多相关文章
- hdu 4055 && hdu 4489 动态规划
hdu 4055: 一开始我想的递推方向想得很复杂,看了别人的博客后才醍醐灌顶: 参照他的思路和代码: #include<cstdio> #include<cstring> # ...
- HDU 4055 The King’s Ups and Downs(DP计数)
题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...
- HDU 4055 Number String dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...
- hdu 4055 Number String
Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...
- HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意: 给你一个由'I', 'D', '?'组成的字符串,长度为n,代表了一个1~n+1的排列中 ...
- HDU 4055:Number String(DP计数)
http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意:给一个仅包含‘I','D','?'的字符串,’I'表示前面的数字比后面的数字要小(Increase升 ...
- hdu 3943 经典数位dp好题
/* 题意:求出p-q的第j个nya数 数位dp,求出p-q的所有nya数的个数很好求,但是询问求出最终那个第j个值时是我不会求了看了下别人的思路 具体就是把p-q的第j个转化成0-q的第low+j个 ...
- hdu 4055 递推
转自:http://blog.csdn.net/shiqi_614/article/details/7983298 题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果 ...
- HDU 1176 经典dp
记录最晚时间 从time为2枚举到最晚时间 每个时间段的x轴节点都等于上一个时间段的可触及的最大馅饼数 #include<stdio.h> #include<string.h> ...
随机推荐
- 特殊文件权限(setuid、setgid 和 Sticky 位)
可执行文件和公共目录可以使用三种特殊类型的权限:setuid.setgid 和 sticky 位.设置这些权限之后,运行可执行文件的任何用户都应采用该可执行文件属主(或组)的 ID. setuid 权 ...
- C#下载apk文件
string fileName = "name.apk";//客户端保存的文件名 string filePath = Server.MapPath("ap ...
- SSH登陆响应慢的问题
http://xiaobin.net/201112/ssh-login-quite-slow/ 同样的问题,有可能是两种情况: 第一种情况比较常见,也有很多资料提及到,就是在SSH登陆时服务器端会对客 ...
- CentOS安装rz\sz命令
执行以下命令进行安装: yum install lrzsz 安装完成后即可操作rz和sz命令. rz:本地文件上传. sz:Linux系统文件下载到本地.
- python--文件处理范例
import os,os.path,string dir="D:\\curl\\data" if (os.path.exists(dir)==False): print " ...
- convertView与ViewHolder有什么区别,好处在哪里
convertView 在API中的解释是The old view to reuse, if possible, 第一次getView时还没有convertView,这时你便创建了一个新的vi ...
- pdo连接mysql操作方法
PDO常用方法: PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作. PDO::exec()主要是针对没有结果集合返回的操作.如insert,u ...
- JVM性能调优入门
1. 背景 虽然大多数应用程序使用JVM的默认设置就能很好地工作,仍然有不少应用程序需要对JVM进行额外的配置才能达到其期望的性能要求. 现在JVM为了满足各种应用的需要,为程序运行提供了大量的JVM ...
- atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
atitit.jQuery Validate验证框架详解与ati Validate 设计新特性 1. AtiValidate的目标1 2. 默的认校验规则1 2.1. 使用方式 1.metadata用 ...
- erlang四大behaviour之一gen_server(转载)
erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能用自己的module实现,这也就是behaviour了,应用behaviour可以减少与本身事务无关的代码量,设计 ...