ZOJ3543 Number String 动态规划

ZOJ3543 Number String

状态f[i][j]表示长度为I的全排列,符合字符串的要求,最后一位数字是j的方案数。

重点在要始终保持是f算的排列的数量,然后转移时用这些推出来新的情况。

就是j<=i

从长度是i-1的排列推长度是i的时候。因为确定了最后一位以后,前面不考虑数值,考虑名次还是一个i-1的排列的某一个。所以,如果要再最后加一个j,可以考虑认为是把前面大于等于j的数字都加一,就得到i的一个排列。

对于‘I‘或者‘?‘

  f[i][j]+=f[i][2..j-1]

对于‘D‘或者‘?‘

  f[i][j]+=f[i][j..i-1]

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const long long MOD  = 1000000007;
const int maxn = 1000 + 10 ;
char s[maxn];
long long f[maxn][maxn],sum[maxn];

int main()
{
    while(scanf("%s",s)!=EOF){
        int len = strlen(s);
        int n = len + 1 ;
        memset(f,0,sizeof(f));
        memset(f,0,sizeof(f));
        f[1][1]=1;
        for(int i=1;i<=n;i++) sum[i]=1;

        for(int i=2;i<=n;i++){
            if(s[i-2]==‘I‘ || s[i-2]==‘?‘)
                for(int j=2;j<=i;j++)
                    f[i][j]=(f[i][j]+sum[j-1])%MOD;
            if(s[i-2]==‘D‘ || s[i-2]==‘?‘)
                for(int j=1;j<i;j++)
                    f[i][j]=((sum[i-1]-sum[j-1]+MOD)%MOD+f[i][j])%MOD;
            for(int j=1;j<=i;j++)
                sum[j]=(sum[j-1]+f[i][j])%MOD;
        }

        printf("%lld\n",sum[n]);
    }
    return 0;
}

ZOJ3543 Number String 动态规划

时间: 2024-10-13 22:21:54

ZOJ3543 Number String 动态规划的相关文章

Hdu4055 Number String

Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2007    Accepted Submission(s): 973 Problem Description The signature of a permutation is a string that is computed as follows: for

JavaScript变量二(数据类型,Number,String,Object)

Number类型: Number类型是JavaScript中最令人关注也是最复杂的类型了.这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值).为支持各种数值类型,ECMA-262定义了不同的数值字面量格式. 主要分为十进制,八进制,十六进制.除了以十进制表示外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的自面值来表示,其中,八进制字面值的第一位必须是(0),然后是八进制数字序列(0-7).如果字面值中的数值超出了范围,那么前面的零将被忽

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

flex匹配json number, string

根据官网给出的number格式定义很容易匹配: DIGIT [0-9] DIGITS {DIGIT}+ INT "-"?([0-9]|[1-9][0-9]*) FRAC "."{DIGITS} E [eE][-+]? EXP {E}{DIGITS} NUMBER {INT}({FRAC}|{EXP}|{FRAC}{EXP})? string的匹配就复杂点, 开始一直没有匹配后, 主要是转移字符的问题, 后来在stack overflow上找到了解决办法. 主要参考的

Javascript中类型: undefined, number ,string ,object ,boolean

var a1; var a2 = true;var a3 = 1;var a4 = "Hello";var a5 = new Object();var a6 = null;var a7 = NaN;var a8 = undefined; alert(typeof a); //显示"undefined"alert(typeof a1); //显示"undefined"alert(typeof a2); //显示"boolean"

1038 Recover the Smallest Number string还能这样用 cmp真滴强大

Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given { 32, 321, 3214, 0229, 87 }, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to differe

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 5707 Combine String(动态规划)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意: 给你三个字符串 S1, S2, S3, 让你判断 S3 是否恰好由字符串 S1 和 S2组成, S1 为 S3 的子串, S2 也为 S3 的子串, 可以不连续. 思路: 设 dp[i][j] 表示字符串 S3 的前 i + j 位是否可以由字符串 S1 的前 i 位以及字符串 S2 的前 j 位组成. dp[i][j] = 1 表示可以, dp[i][j] = 0 则表示不可以. 则

ZOJ 3543 Number String 【2011大连区域赛】【dp】

题意 给出一串由D,I,?构成的长为n的字符串,这个字符串表示满足某种规则的1到n+1的排列集合,D表示该位置数字比前面一个小,I表示该位置的数字比前面一个大,?表示不确定可D可I 比如 满足DI的数字排列有3,1,2和2,1,3 1<=n<=1000,求有多少种满足此条件的字符串 设计的dp如下 dp[i][j] 代表满足上述字符串前i-1项的长为i尾巴为j的1到i的排列数目 当第i-1项为D时 dp[i][j]=sigma(dp[i-1][k]),i-1=>k>=j 当第i-1