Description
给出一组长度为nnn的序列,a1,a2,a3,a4...ana_1,a_2,a_3,a_4...a_na1,a2,a3,a4...an, 求出这个序列长度为kkk的严格递增子序列的个数
Input
第一行输入TTT组数据 T(0≤T≤10)T (0\leq T\leq 10)T(0≤T≤10)
第二行输入序列大小n(1≤n≤100)n(1\leq n \leq100)n(1≤n≤100),长度k(1≤k≤n)k(1\leq k \leq n)k(1≤k≤n)
第三行输入nnn个数字ai(0≤ai≤1e9)a_i(0\leq a_i \leq 1e9)ai(0≤ai≤1e9)
Output
数据规模很大, 答案请对1e9+71e9+71e9+7取模
Sample Input 1
2 3 2 1 2 2 3 2 1 2 3
Sample Output 1
2 3
简单dp没做出来不应该,更新下题解
#include<stdio.h>
#include<string.h>
const int mod=1000000007;
int a[110];
int dp[110][110];//用第一维记录序列的结尾第二位记录上升子序列长度
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
dp[i][1]=1;//长度为一的全部赋值为一
}
for(int i=1;i<=n;i++)//枚举序列结尾
{
for(int j=2;j<=i;j++)//枚举序列长度
{
for(int k=j-1;k<i;k++)
{
if(a[i]>a[k])
{
dp[i][j]=(dp[i][j]+dp[k][j-1])%mod;//状态转移方程,不解释了
}
}
}
}
long long ans=0;
for(int i=k;i<=n;i++)
{
ans+=dp[i][k];
}
printf("%lld\n",ans);
}
}