HDU - 4055 Number String

题目大意:给定一个字符串,I表示本字符要比前一个字符大,D表示本字符要不前一个字符小,?可大可小,问1~n的所有排列中,有多少满足条件

具体思路:DP

f[i][j]表示i个数的排列,第i个是j的方案数

如果是I,f[i][j]=f[i-1][1]+...+f[i-1][j-1]

如果是D,f[i][j]=f[i-1][i-1]+...+f[i-1][1]

然后加个前缀和优化就好了

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int ha=1000000007;
char s[10000];
int n,m,i,j,f[1010][1010],k,sum[1010][1010],ans;
main()
{
    while(~scanf("%s",s))
    {
        n=strlen(s)+1;
        memset(f,0,sizeof(f));
        memset(sum,0,sizeof(sum));
        f[1][1]=1;
        for (i=1; i<=n; i++)sum[1][i]=1;
        for (i=2; i<=n; i++)
        {
            for (j=1; j<=i; j++)
            {
                if(s[i-2]==‘D‘)f[i][j]=sum[i-1][i-1]-sum[i-1][j-1]+ha;else if(s[i-2]==‘I‘) f[i][j]=sum[i-1][j-1]-sum[i-1][0]+ha;else f[i][j]=sum[i-1][i-1]-sum[i-1][0]+ha;
                sum[i][j]=f[i][j]%ha;
            }
            for (j=1;j<=n;j++)sum[i][j]+=sum[i][j-1],sum[i][j]%=ha;
        }
        ans=0;
        for (i=1; i<=n; i++)ans+=f[n][i];
        printf("%lld\n",ans%ha);
    }
    return 0;
}
时间: 2024-10-10 06:17:55

HDU - 4055 Number String的相关文章

hdu 4055 Number String(dp)

Problem Description The signature of a permutation is a string that is computed as follows: for each pair of consecutive elements of the permutation, write down the letter 'I' (increasing) if the second element is greater than the first one, otherwis

HDU 4055 Number String 计数DP

设dp[i][j]表示以j开头的,长度为i的排列的数目. 从字符串的后面到前面DP就得出答案了. #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int MAXN=1010; const int MOD=1000000007; char str[MAXN]; int dp[MAXN][MAXN]; in

hdu 4055 Number String(递推DP)

给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http://blog.csdn.net/shiqi_614/article/details/7983298 http://www.cnblogs.com/kuangbin/archive/2012/10/04/2711330.html http://blog.csdn.net/cc_again/artic

HDU 4055 The King’s Ups and Downs(DP计数)

题意:国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个的情况的答案已给出. 思路:是此题HDU 4055 Number String(DP计数) 的简单版,所以看此题解就行了.数量较小,可以预先算出来.要同时考虑 <><>和><><这样的两种情况. 1 #include <iostream> 2 #inc

hdu 1711 Number Sequence(KMP)

# include <stdio.h> # include <string.h> # include <algorithm> using namespace std; int n,m,next[10010],a[1000010],b[10010]; void Getnext() { int i=0,j=-1; next[0]=-1; while(i<m) { if(j==-1||b[i]==b[j]) i++,j++,next[i]=j; else j=next[

HDU 1711 Number Sequence KMP题解

KMP查找整数数列,不是查找字符串. 原理是一样的,不过把字符串转换为数列,其他基本上是一样的. #include <stdio.h> #include <string.h> const int MAX_N = 1000001; const int MAX_M = 10001; int strN[MAX_N], strM[MAX_M], next[MAX_M], N, M; void getNext() { memset(next, 0, sizeof(int) * M); for

HDU 4279 Number 规律题

题意: 定义函数F(x) : 区间[1,x]上的y是满足:GCD(x,y)>1 && x%y>0的 y的个数. 问:对于任意区间[l,r] 上的F(l···r) 有几个函数值是奇数的. 打表找规律. 打的是[1,x]区间的结果 把所有结果不相同的值打出来(因为结果是递增的,所以只观察不相同的结果) 发现:ans = x/2-2 || x/2-1 再把所有结果不同 && x/2-1的值打出来 发现 sqrt(x) &1 == 1 得到:ans = x/2-

HDU 4952 Number Transformation 打表规律

点击打开链接 Number Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 495    Accepted Submission(s): 248 Problem Description Teacher Mai has an integer x. He does the following operation

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi&#39;an Online) 题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 Number Sequence Problem Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● ai ∈ [0,n] ● ai ≠ aj( i ≠ j ) For sequence a and sequ