zoukankan      html  css  js  c++  java
  • csuoj 1354: Distinct Subsequences

    这个题是计算不同子序列的和;

    spoj上的那个同名的题是计算不同子序列的个数;

    其实都差不多;

    计算不同子序列的个数使用dp的思想;

    从头往后扫一遍

    如果当前的元素在以前没有出现过,那么dp[i]=dp[i-1]*2+1;

    不然找到最右边的这个元素出现的位置j;

    dp[i]=d[i]*2-dp[j];

    spoj代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define mod 1000000007
    using namespace std;
    
    char s[100005];
    int pos[100005];
    int biao[30];
    int dp[100005];
    
    int main()
    {
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            memset(biao,0,sizeof biao);
            scanf("%s",s+1);
            n=strlen(s+1);
            for(int i=1; i<=n; i++)
            {
                pos[i]=biao[s[i]-'A'];
                biao[s[i]-'A']=i;
            }
            dp[0]=0;
            for(int i=1; i<=n; i++)
            {
                if(pos[i]==0)
                {
                    dp[i]=(dp[i-1]*2+1);
                    while(dp[i]>=mod)dp[i]-=mod;
                }
                else
                {
                    dp[i]=(dp[i-1]*2-dp[pos[i]-1]);
                    if(dp[i]<0)dp[i]+=mod;
                    while(dp[i]>=mod)dp[i]-=mod;
                }
            }
            printf("%d
    ",dp[n]+1);
        }
        return 0;
    }
    View Code

    csuoj代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define mod 1000000007
    using namespace std;
     
    char s[100005];
    int pos[100005];
    int biao[15];
    int dp[100005];
    long long sum[100005];
     
    int main()
    {
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            memset(biao,0,sizeof biao);
            scanf("%s",s+1);
            n=strlen(s+1);
            for(int i=1; i<=n; i++)
            {
                pos[i]=biao[s[i]-'0'];
                biao[s[i]-'0']=i;
            }
            dp[0]=0;
            for(int i=1; i<=n; i++)
            {
                long long tmp=sum[i-1];
                if(pos[i]==0)
                {
                    dp[i]=dp[i-1]*2;
                    if((s[i]-'0')>0)dp[i]+=1;
                    while(dp[i]>=mod)dp[i]-=mod;
                }
                else
                {
                    dp[i]=(dp[i-1]*2-dp[pos[i]-1]);
                    tmp-=sum[pos[i]-1];
                    if(tmp<0)tmp+=mod;
                    if(dp[i]<0)dp[i]+=mod;
                    while(dp[i]>=mod)dp[i]-=mod;
                }
                sum[i]=(tmp*10+(long long)(dp[i]-dp[i-1])*(s[i]-'0')+sum[i-1])%mod;
                if(sum[i]<=0)sum[i]+=mod;
            }
            printf("%lld
    ",sum[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    获取腾讯soso地图坐标代码
    PHP获取服务器的mac地址类
    关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法
    PhpExcel笔记,phpExcel中文帮助手册
    微信开发之——Php批量生成带参数的二维码
    [转载]数据管理——数据血缘关系概述
    HDFS学习总结
    CDH5.7Hadoop集群搭建(离线版)
    QlikSense系列(1)——整体介绍
    Python学习小计
  • 原文地址:https://www.cnblogs.com/yours1103/p/3470253.html
Copyright © 2011-2022 走看看