Problem Description
现在给你n个不同的数,a1,a2,a3, ..... ,an。求长度为k的不同递减序列的个数,既包含连续也包含不连续的序列。
例如:给你n=3,k=2,原始序列为 3 ,1,2 。长度为2的递减序列为3,1和 3,2;
一共有两组所以答案为2.
Input
第一行输入n,k(1<=n<=20000, 2=<k<=10)分别代表n个不同的整数,递减序列的长度。
第二行输入n个整数ai。(0<=ai<=1e5).
Output
输出一个整数为长度为k 的不同的递减数列的个数。答案取余1000000000;
Sample Input
5 3 5 4 3 2 1
Sample Output
10
题解思路:
dp[i][j] 表示最后一位在第i位长度为j的递减序列的长度;
所以dp方程为: if(arr[now]<arr[i]) dp[i][j]=dp[now][j-1]
最后累加ans[1...n][k] 即可;
时间复杂度在4e9;过了蛮不可思议的;
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e4+10;
const int mod=1000000000;
int dp[maxn][15];
int arr[maxn];
#undef int
int main(){
#define int long long
int n,kk;
scanf("%lld%lld",&n,&kk);
for(int i=1;i<=n;i++)
{
scanf("%lld",arr+i);
dp[i][1]=1;
for(int j=1;j<i;j++)
{
if(arr[j]>arr[i])
for(int k=kk;k>1;k--)
{
dp[i][k]+=dp[j][k-1];
dp[i][k]%=mod;
}
}
}
int ans=0;
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=kk;j++)
{
cout<<dp[i][j]<<" ";
}cout<<endl;
}*/
for(int i=1;i<=n;i++)
ans=(ans+dp[i][kk])%mod;
printf("%lld\n",ans);
return 0;
}