The Battle of Chibi

Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 591    Accepted Submission(s): 192

Problem Description
Cao Cao made up a big army and was going to invade the whole South China. Yu Zhou was worried about it. He thought the only way to beat Cao Cao is to have a spy in Cao Cao's army. But all generals and soldiers of Cao Cao were loyal, it's impossible to convince any of them to betray Cao Cao.

So there is only one way left for Yu Zhou, send someone to fake surrender Cao Cao. Gai Huang was selected for this important mission. However, Cao Cao was not easy to believe others, so Gai Huang must leak some important information to Cao Cao before surrendering.

Yu Zhou discussed with Gai Huang and worked out N information to be leaked, in happening order. Each of the information was estimated to has ai value in Cao Cao's opinion.

Actually, if you leak information with strict increasing value could accelerate making Cao Cao believe you. So Gai Huang decided to leak exact M information with strict increasing value in happening order. In other words, Gai Huang will not change the order of the N information and just select M of them. Find out how many ways Gai Huang could do this.

 
Input
The first line of the input gives the number of test cases, T(1≤100). T test cases follow.

Each test case begins with two numbers N(1≤N≤103) and M(1≤M≤N), indicating the number of information and number of information Gai Huang will select. Then N numbers in a line, the ith number ai(1≤ai≤109) indicates the value in Cao Cao's opinion of the ith information in happening order.

 
Output
For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is the ways Gai Huang can select the information.

The result is too large, and you need to output the result mod by 1000000007(109+7).

 
Sample Input
2
3 2
1 2 3
3 2
3 2 1
 
Sample Output
Case #1: 3
Case #2: 0

Hint

In the first cases, Gai Huang need to leak 2 information out of 3. He could leak any 2 information as all the information value are in increasing order.
In the second cases, Gai Huang has no choice as selecting any 2 information is not in increasing order.

 
 
题意:求n个数的长度为m的严格最长上升子序列有多少种?
分析:
一个很显然的dp
dp[i][j]代表现在选了i个,最后一个是第j个数的种数。
转移方程就是把dp[i][k],a[k]<a[j]的所有方案数加起来
转移的话可以考虑树状数组。
 #include <cstdio>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std; const int N = , Mod = ;
int n, m, arr[N];
int dp[N][N], tr[N][N];
map<int, int> Hash;
int tmp[N], tot; inline int Lowbit(int x)
{
return x & (-x);
} inline void Plus(int &x, int y)
{
x = x + y;
if(x >= Mod) x -= Mod;
} inline void Add(int index, int x, int val)
{
x++;
for( ; x <= tot + ; x += Lowbit(x)) Plus(tr[index][x], val);
} inline int Query(int index, int x)
{
int ret = ;
x++;
for( ; x; x -= Lowbit(x)) Plus(ret, tr[index][x]);
return ret;
} inline void Solve()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) scanf("%d", &arr[i]); Hash.clear();
for(int i = ; i <= n; i++) tmp[i] = arr[i];
sort(tmp + , tmp + + n);
tot = ;
Hash[tmp[]] = ;
for(int i = ; i <= n; i++)
if(tmp[i] != tmp[i - ])
Hash[tmp[i]] = ++tot; for(int i = ; i <= n; i++) arr[i] = Hash[arr[i]];
/*for(int i = 1; i <= n; i++)
printf(i < n ? "%d " : "%d\n", arr[i]);*/ for(int i = ; i <= m; i++)
for(int j = ; j <= tot + ; j++) tr[i][j] = ;
for(int i = ; i <= m; i++) dp[][n] = ;
dp[][] = ;
Add(, , );
for(int i = ; i <= n; i++)
{
for(int j = ; j <= m; j++)
{
dp[i][j] = ;
int cnt = Query(j - , arr[i] - );
Plus(dp[i][j], cnt);
Add(j, arr[i], dp[i][j]);
}
} int ans = ;
for(int i = ; i <= n; i++) Plus(ans, dp[i][m]);
printf("%d\n", ans);
} int main()
{
int test;
scanf("%d", &test);
for(int testnumber = ; testnumber <= test; testnumber++)
{
printf("Case #%d: ", testnumber);
Solve();
}
return ;
}

The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542的更多相关文章

  1. The 2015 China Collegiate Programming Contest A. Secrete Master Plan hdu5540

    Secrete Master Plan Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  2. The 2015 China Collegiate Programming Contest Game Rooms

    Game Rooms Time Limit: 4000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  3. The 2015 China Collegiate Programming Contest L. Huatuo's Medicine hdu 5551

    Huatuo's Medicine Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  4. The 2015 China Collegiate Programming Contest K Game Rooms hdu 5550

    Game Rooms Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  5. The 2015 China Collegiate Programming Contest H. Sudoku hdu 5547

    Sudoku Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  6. The 2015 China Collegiate Programming Contest G. Ancient Go hdu 5546

    Ancient Go Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  7. The 2015 China Collegiate Programming Contest E. Ba Gua Zhen hdu 5544

    Ba Gua Zhen Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  8. The 2015 China Collegiate Programming Contest D.Pick The Sticks hdu 5543

    Pick The Sticks Time Limit: 15000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  9. The 2015 China Collegiate Programming Contest -ccpc-c题-The Battle of Chibi(hdu5542)(树状数组,离散化)

    当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂).百度百科--离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率. 这道题是dp题,离散化和树状数 ...

随机推荐

  1. 模拟赛1102d2

    /* φ(n)=φ(p^k)=p^k-p^(k-1)=(p-1)*p^(k-1) φ(m*n)=φ(m)*φ(n) 直接套公式做,因为分解质因数时,只分解一个数,所以可以不打素数表,只将n分解到√n就 ...

  2. ios添加百度地图方法

    Hello BaiduMapiOS SDK 引入头文件 引入静态库文件 引入系统framework 引入mapapi.bundle资源文件 初始化BMKMapManager 创建BMKMapView ...

  3. Apache commons-codec笔记

  4. python中的时间处理函数

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块我在之前的文章已经有所介绍,它提供 的接口与C标准库time.h基本一致.相比于time模块 ...

  5. sql server 时间小汇

    SQL server DATE函数 (1)getdate   返回当前系统的日期和时间,精确到3毫秒 要求:获得系统的当前时间 语句:SELECT getdate() 执行结果: 注:getutcda ...

  6. set -x 跟踪脚本执行信息

    注意set -x其中"-"与"x"之间没有空格 [root@GitLab sh]# ./sx.sh heelo + a=heelo + echo heelo h ...

  7. max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

    sh- /etc/sysctl.conf vm.max_map_count = #在/etc/sysctl.conf追加上面一条 #并执行命令: sysctl -p

  8. Android4.4 以太网和DHCP启动过程介绍

    转自:http://blog.csdn.net/wlwl0071986/article/details/51451843 Android4.4已经加入了以太网的支持.现在对以太网的初始化流程.网络策略 ...

  9. Recovery和Charger模式下屏幕旋转180度

    转自:http://www.etwiki.cn/android/1267.html 如何让Recovery (系统固件升级),charger(关机充电动画)时屏幕旋转180度 解决方法: 1.在boo ...

  10. WebApiのエラーメッセージをどうカスタマイズです?

    本来是发布在客户的Wiki上,所以就用日语写. ------------------------------------------------------------------------ Web ...