题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055

题意:

  给你一个由'I', 'D', '?'组成的字符串,长度为n,代表了一个1~n+1的排列中(数字不重复),相邻数字的增长趋势。('I'为增,'D'为减,'?'为未知)

  问你符合条件的数列有多少种。

题解:

  表示状态:

    dp[i][j] = combinations

    表示长度为i的排列(由1~i组成),末尾为j,这样的排列的个数

  找出答案:

    ans = ∑ dp[n][1 to n]

  如何转移:

    先考虑增长('I')。

    对于dp[i][j],是由dp[i-1][k with k < j]在末尾添加一个j得到的。

    也就是:

      dp[i][j] = ∑ dp[i-1][1 to j-1]

    可是在dp[i-1][k with k < j]的数列中,由可能j已经选过。

    为了处理这种情况,可以想成将原来数列中 >= j的数都+1。

    这样并不影响原数列的增长性,也不影响答案。

    对于'D'和'?'同理:

      D: dp[i][j] = ∑ dp[i-1][j to i-1]

      ?: dp[i][j] = ∑ dp[i-1][1 to i-1]

AC Code:

 // state expression:
// dp[i][j] = combinations
// i: considering ith num
// j: last num
//
// find the answer:
// sigma dp[n][1 to n]
//
// transferring:
// if increase
// dp[i][j] = sigma dp[i-1][1 to j-1]
// if decrease
// dp[i][j] = sigma dp[i-1][j+1 to i-1]
//
// boundary:
// dp[1][1] = 1
// others = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1005
#define MOD 1000000007 using namespace std; int n;
int ans;
int dp[MAX_N][MAX_N];
int sum[MAX_N][MAX_N];
string s; int cal_mod(int a)
{
return (a%MOD+MOD)%MOD;
} int cal_sum(int i,int x,int y)
{
if(x>y) return ;
if(x==) return sum[i][y];
return cal_mod(sum[i][y]-sum[i][x-]);
} void update_sum(int i,int j,int a)
{
if(j==) sum[i][j]=cal_mod(a);
else sum[i][j]=cal_mod(sum[i][j-]+a);
} void solve()
{
n=s.size()+;
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
dp[][]=;
for(int i=;i<=n;i++) sum[][i]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=i;j++)
{
if(s[i-]=='I') dp[i][j]=cal_sum(i-,,j-);
else if(s[i-]=='D') dp[i][j]=cal_sum(i-,j,i-);
else dp[i][j]=cal_sum(i-,,i-);
update_sum(i,j,dp[i][j]);
}
}
ans=cal_sum(n,,n);
} void print()
{
cout<<ans<<endl;
} int main()
{
while(cin>>s)
{
solve();
print();
}
}

HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】的更多相关文章

  1. hdu 4055 Number String(有点思维的DP)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. HDU 4055 Number String dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...

  3. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. hdu 4055 Number String

    Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...

  5. hdu 4055 Number String(dp)

    Problem Description The signature of a permutation is a string that is computed as follows: for each ...

  6. HDU 4055 Number String (计数DP)

    题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的. 如果是‘D’,则反之. 析:dp[i][j] 表示前 i ...

  7. HDU 4055 Number String(DP计数)

    题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...

  8. hdu 4055 Number String(递推DP)

    给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ...

  9. HDU 4054 Number String

    HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...

随机推荐

  1. git 修改远程仓库地址

    以前的老项目需要修改git路径,为了保留之前的上传记录和分支等可以通过以下方法解决这个问题 sourceTree项目远程仓库,直接修改origin路径,然后提交一个commit即可将项目上传到新的gi ...

  2. iOS 字符属性NSAttributedString描述【转载】

    /* 字符属性 字符属性可以应用于 attributed string 的文本中. NSString *const NSFontAttributeName;(字体) NSString *const N ...

  3. k8s部署dashborad

    环境: 两台虚拟机, 10.10.20.203 部署docker.etcd.flannel.kube-apiserver.kube-controller-manager.kube-scheduler ...

  4. python write file

    fileHandle = open ( 'test.txt', 'a' ) fileHandle.write ( '\n\nBottom line.' ) fileHandle.close() 转自: ...

  5. 2016/05/17 thinkphp3.2.2 分页的使用:①在Home下设置Publics文件夹或在thinkPHP下library的vender 把page.class.php 考贝进入 ②通过new 实例化方式调用 $page=new \Home\Publics\Page($total,3);

    注意分页的方法有两种:一种是thinkphp3.2 自带的   另一种是之前新闻页用过的     显示效果稍有差别 显示效果: 细节问题: ①搜索页面  要加session判断   和  分页 ②修改 ...

  6. hdu3579(线性同余方程组)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. Linux 服务器上建立用户并分配权限

    查看用户 whoami #要查看当前登录用户的用户名 who am i #表示打开当前伪终端的用户的用户名 who mom likes who 命令其它常用参数 参数 说明 -a 打印能打印的全部 - ...

  8. MATLAB循环结构:while语句P69范数待编

    while语句的一般格式为: while 条件 循环体语句 end 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和. 程序如下: sum=; n=; x=input('输入一个数字 ...

  9. (比赛)A - Simple String Problem

    A - Simple String Problem Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%lld & ...

  10. 记录-配置tomcat不加项目名即可访问项目

    环境:tomcat 在eclipse中  打开Servers  下的server.xml文件,在最下方你会看到类似 <Context docBase="/vankeplatform&q ...