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]);
}
};

  

TopCoder SRM 582 ColorfulBuilding的更多相关文章

  1. TopCoder SRM 582 Div 1 - Problem 1000 SemiPerfectPower

    首先我们可以把答案差分,那么我们只需要求出\(1\)~\(x\)范围内的满足条件的数即可. 题目要求的应该是这个东西的个数: \(l \leq a*b^c \leq r(1 \le a < b) ...

  2. TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

    传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...

  3. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  4. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  5. TopCoder SRM 667 Div.2题解

    概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...

  6. Topcoder Srm 673 Div2 1000 BearPermutations2

    \(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...

  7. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

  8. [topcoder]SRM 646 DIV 2

    第一题:K等于1或者2,非常简单.略.K更多的情况,http://www.cnblogs.com/lautsie/p/4242975.html,值得思考. 第二题:http://www.cnblogs ...

  9. [topcoder]SRM 633 DIV 2

    第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...

随机推荐

  1. libevent源码安装及Linux自动编译功能总结

    这个..那个..后来发现..直接用jumbo就可以安装libevent.不过,学习一些automake的知识还是有好处的. 03机器也安装了. 这几天在阅读libevent源码,发现参考资料是基于li ...

  2. ajax获取城市和相应的地区

    <!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...

  3. mac homebrew PHP

    启动PHP p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Andale Mono"; color: #29f914; ...

  4. xcode 脚本编译,打包ipa

    1.清理工程 /usr/bin/xcodebuild -target targetName clean 2.编译 /usr/bin/xcodebuild -target targetName buil ...

  5. 测试耗电量的工具(Android)

    Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具. 支持SDK:Android2.2以及以上版本 Emmagee功能介绍 1.检测当前时间被测应用占用的CP ...

  6. SAP标准价格修改

    标准MR21修改前期的价格,不会影响到当期. 相关配置 事务码OMRN. 如企业账期已经开到 2015 年 2 月,会计账期还可对 1月记账,配置后可修改1月物料价格.

  7. Xml反序列化

    XML的反序列化可在类的属性上标记特性来隐射反序列化.例如这种形式 public class PaymentAccount { [XmlAttribute("name")] pub ...

  8. noip2016酱油记day1

    真的是noip2016酱油记了. t1模拟,应该可以过. t2用了个简单的桶瞎搞,估计剩50pt了. t3直接不会写. 心好累... 考的分数肯定没去年高. 但不论如何,明天正常发挥就好. 正常发挥下 ...

  9. JAVA多线程和并发基础面试问答

    转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...

  10. WebViewJavascriptBridge-Obj-C和JavaScript互通消息的桥梁

    转载至:http://www.cocoachina.com/ios/20150629/12248.html 译者:@coderyi9 本文翻译自Marcus Westin的开源框架WebViewJav ...