TopCoder SRM 582 ColorfulBuilding

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

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

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

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  color1, vector  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=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

  

转载于:https://www.cnblogs.com/liulangye/p/3139901.html

你可能感兴趣的:(TopCoder SRM 582 ColorfulBuilding)