zoukankan      html  css  js  c++  java
  • TopCoder SRM 582 ColorfulBuilding

    DP  思路是三维,但是时间肯定会超时,需要根据其特殊性质加两个标记数组,优化成二维。

    刚开始想了N久N久,没感觉,还是动手画了一下才有用呀,意淫再久,不如动手呀。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<stack>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<set>
    #include<map>
    
    using namespace std;
    const int INF=0x3f3f3f3f;
    const long long MOD=1000000009;
    const int N=3000;
    const int M=2500;
    long long dp[N][M];
    long long sum[M],a[N];
    int getInt(char x)
    {
        if(x>='A'&&x<='Z')
        return x-'A';
        return x-'a'+26;
    }
    int hashChartoInt(char x,char y)
    {
        return getInt(x)*52+getInt(y);
    }
    long long add(long long x,long long y)
    {
        long long s=x+y;
        if(s>=MOD) s-=MOD;
        return s;
    }
    long long sub(long long x,long long y)
    {
        long long s=x-y;
        if(s<=0) s+=MOD;
        return s;
    }
    long long mul(long long x,long long y)
    {
        return (x*y)%MOD;
    }
    class ColorfulBuilding
    {
        public:
        int count(vector <string> color1, vector <string> color2, int L)
        {
            memset(dp,0,sizeof(dp));
            memset(sum,0,sizeof(sum));
            memset(a,0,sizeof(a));
            string str1="",str2="";
            for(unsigned int i=0;i<color1.size();++i)
            str1+=color1[i];
            for(unsigned int i=0;i<color2.size();++i)
            str2+=color2[i];
            int n=str1.size();
            for(int j=0;j<N;++j)
            a[j]=1;
            for(int i=0;i<n;++i)
            {
                int nowColor=hashChartoInt(str1[n-i-1],str2[n-i-1]);
                if(i==0)
                {
                    dp[nowColor][1]=1;
                    sum[1]=1;
                    continue;
                }
                for(int j=L;j>=1;--j)
                {
                    dp[nowColor][j]=mul(dp[nowColor][j],a[nowColor]);
                    sum[j]=mul(sub(sum[j],dp[nowColor][j]),i);
                    dp[nowColor][j]=(dp[nowColor][j]*(i+1))%MOD;
                    dp[nowColor][j]=add(dp[nowColor][j],sub(sum[j-1],mul(dp[nowColor][j-1],a[nowColor])));
                    sum[j]=add(sum[j],dp[nowColor][j]);
                }
                for(int j=0;j<N;++j)
                if(j==nowColor)
                a[j]=1;
                else
                a[j]=mul(a[j],i);
            }
            return (int)(sum[L]);
        }
    };
    

      

  • 相关阅读:
    UVA 1557
    基于角色的权限设计(二)
    用DirectShow实现视频採集-流程构建
    oracle中schema指的是什么?
    GCC 命令行具体解释
    希尔排序
    单点登录SSO的实现原理
    济南最新公交线路一览(BRT)
    编写你自己的单点登录(SSO)服务
    C和指针 (pointers on C)——第五章:操作符和表达式
  • 原文地址:https://www.cnblogs.com/liulangye/p/3139901.html
Copyright © 2011-2022 走看看