zoukankan      html  css  js  c++  java
  • HDU

    题目大意:给定一个字符串,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
    ",ans%ha);
        }
        return 0;
    }
  • 相关阅读:
    手撕RPC框架
    关于JVM的一些冷知识
    luoguP2627 修剪草坪
    [USACO16OPEN]248
    luoguP1171 售货员的难题
    luoguP2016 战略游戏
    luoguP2422 良好的感觉
    POJ1160 [IOI2000]Post Office
    luoguP2015 二叉苹果树
    BZOJ1756 小白逛公园
  • 原文地址:https://www.cnblogs.com/Orange-User/p/7768396.html
Copyright © 2011-2022 走看看