思路太繁琐了 ,实在不想解释了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue> #define ull unsigned long long
#define ll long long
#define lint long long
using namespace std; const int INF=0x3f3f3f3f;
const int N=53;
ll c[N][N];
ll dp[N][N][N];
ll dp1[N][N][N];
class Excavations
{
public:
long long count(vector <int> kind, vector <int> depth, vector <int> found, int K)
{
memset(c,0,sizeof(c));
for(int i=0;i<N;++i)
for(int j=0;j<=i;++j)
if(j==0||i==j)
c[i][j]=1;
else
c[i][j]=c[i-1][j]+c[i-1][j-1];
int n=kind.size();
int m=found.size(); set<int>st;
for(int i=0;i<n;++i)
st.insert(depth[i]);
int dep=1;
for(set<int>::iterator it=st.begin();it!=st.end();++it,++dep)
{
for(unsigned int i=0;i<depth.size();++i)
if((*it)==depth[i])
depth[i]=dep;
}
sort(found.begin(),found.end());
vector<int>f[N];
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
if(kind[j]==found[i])
f[i].push_back(depth[j]);
sort(f[i].begin(),f[i].end());
}
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int i=0;i<m;++i)
for(int d=0;d<=n;++d)
for(int w=0;w<K;++w)
if(dp[i][d][w]>0)
{
for(unsigned int l=0;l<f[i].size();++l)
{
for(int x=0;x<=l&&w+x+1<=K;++x)
{
dp[i+1][max(d,f[i][l])][w+x+1]+=dp[i][d][w]*c[l][x];
}
}
}
bool fd[N];
memset(fd,false,sizeof(fd));
for(int i=0;i<m;++i)
fd[found[i]]=true;
vector<int>vd;
int h=0;
for(int i=0;i<n;++i)
if(!fd[kind[i]])
{
vd.push_back(depth[i]);
h=max(h,depth[i]);
}
sort(vd.begin(),vd.end());
int ln=vd.size();
memset(dp1,0,sizeof(dp1));
dp1[ln][n+1][0]=1;
for(int i=ln;i>0;--i)
for(int d=1;d<=n+1;++d)
for(int w=0;w<=ln;++w)
if(dp1[i][d][w])
{
dp1[i-1][d][w]+=dp1[i][d][w];
dp1[i-1][vd[i-1]][w+1]+=dp1[i][d][w];
}
ll s[N]={0};
for(int i=0;i<n;++i)
if(fd[kind[i]])
{
for(int j=1;j<=depth[i];++j)
s[j]++;
}
ll sum=0;
for(int d=2;d<=n+1;++d)
for(int w=0;w<=ln;++w)
if(dp1[0][d][w])
{
for(int d1=1;d1<d;++d1)
for(int w1=1;w1+w<=K;++w1)
if(dp[m][d1][w1])
{
if(s[d]>=K-w1-w)
{
sum+=(dp1[0][d][w]*dp[m][d1][w1]*c[s[d]][K-w-w1]);
}
}
}
return sum;
}
};

Topcoder SRM 584 DIV1 600的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

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

  2. Topcoder Srm 726 Div1 Hard

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

  3. TopCoder SRM 722 Div1 Problem 600 DominoTiling(简单插头DP)

    题意  给定一个$12*12$的矩阵,每个元素是'.'或'X'.现在要求$1*2$的骨牌铺满整个矩阵, 'X'处不能放置骨牌.求方案数. 这道题其实和 Uva11270 是差不多的,就是加了一些条件. ...

  4. SRM 146 DIV1 600

    Problem Statement      Masterbrain is a two player board game in which one player decides on a secre ...

  5. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  6. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  7. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  8. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  9. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

随机推荐

  1. [转载] 一共81个,开源大数据处理工具汇总(下),包括日志收集系统/集群管理/RPC等

    原文: http://www.36dsj.com/archives/25042 接上一部分:一共81个,开源大数据处理工具汇总(上),第二部分主要收集整理的内容主要有日志收集系统.消息系统.分布式服务 ...

  2. 9月java货车版速记

    运算符的优先级java自带的方法正则表达式数组和二维数组:数组遍历,填充数组,数组排序,复制数组,数组查询数组算法:冒泡,选择,反转,快速类和对象:封装,继承,多态,this关键字,抽象类和接口重写和 ...

  3. Android开发面试经——6.常见面试官提问Android题②(更新中...)

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...

  4. strlen函数

    笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数.函数接口声明如下:int strlen(const char *p); http://soft.chinabyt ...

  5. grep的用法

    grep的用法首先创建我们练习grep命令时需要用到的demo文件demo_file. $ cat demo_file THIS LINE IS THE 1ST UPPER CASE LINE IN ...

  6. 探究requestDisallowInterceptTouchEvent失效的原因

    昨天在用requestDisallowInterceptTouchEvent的时候,发如今设置了requestDisallowInterceptTouchEvent(true)之后,父View的onI ...

  7. jsp 页面 jstl 日期的计算

    1. <% page import ="java.util.Date"%> 2. <% Date date = new Date(); date = new Da ...

  8. java 多线程3(线程安全)

    需求:模拟三个窗口同时买票. 问题1:static 修饰num,只创建一份在内存中,要不就会创建3份. 问题2:线程安全问题.(代码重1的红色字体) 出现的原因:存在两个或两个以上的线程对象,而且线程 ...

  9. 扩展Date的format方法--格式化日期时间

    Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, "d+& ...

  10. jmeter笔记2

    使用jmeter它来完成最常用的三种类型服务器,即 Web 服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测 ...