1868: UP UP UP!
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 76 Solved: 20
Submit Status Web Board
Description
题意很简单,给你长度为n的序列,找出有多少个不同的长度为m的严格上升子序列。(PS:相同子序列的定义为,每一个元素对应的下标都相同)
Input
输入数据第一行是个正整数T,表示总共有T组测试数据(T <= 5); 每组数据第一行为n和m,以空格隔开(1 <= n <= 100, 1 <= m <= n); 第二行为n个数,第i个数ai依次代表序列中的每个元素(1 <= ai <= 10^9);
Output
对于每组数据,输出一行Case #x: y,x表示当前测试数据的序号(从1开始),y表示结果。 需要注意的是,结果有可能很大,你需要将结果对1000000007(10^9+7)取余。
Sample Input
23 21 2 33 23 2 1
Sample Output
Case #1: 3Case #2: 0
解题思路:dp[i][j]代表以i结尾长度为j的严格上升子序列有多少种,
那么就是dp[i][j]+=dp[k][j-1],k<i&&a[k]<a[i].用dfs会超时
代码如下:
#include<stdio.h>
#include<string.h>
int num[110];
long long dp[110][110];
int main(){
int t,n,m,i,j,cas,k;
long long sum;
scanf("%d",&t);
cas=1;
while(t--){
sum=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&num[i]);
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
dp[i][1]=1;
dp[i][0]=0;
for(j=1;j<=i&&j<=m;j++){
for(k=1;k<i;k++){
if(num[i]>num[k]){
dp[i][j]=(dp[i][j]+dp[k][j-1])%(1000000000+7);
}
}
}
sum=(sum+dp[i][m])%(1000000000+7);
}
printf("Case #%d: %lld\n",cas++,sum);
}
return 0;
}