这个题似乎有问题,题中明明要求每个数组不同,想了很久,不知道怎么判重复,最后却看别人都是不判重 直接过的
dp[i][j] 表示第i个数作为第j个数 的情况
dp[i][f] = sum(dp[j][f-1]) num[i] > num[j]
另外,如果大数使用十进制计算 要么 wrong answe 要么 爆内存 ,所以尽量开大 ,这里用的10^8
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define MS(x,y) memset(x,y,sizeof(x))
#define MOD 100000000
void fr(){freopen("t.txt","r",stdin);}
typedef long long LL;
struct Bignum
{
int len,a[101];
Bignum()
{
len = 0;
MS(a,0);
}
}dp[105][105],ans;
void add(Bignum &a,Bignum &b)
{
int len = max(a.len,b.len);
int i,j;
for(i = 1; i <= len; i++)
{
a.a[i] += b.a[i];
a.a[i+1] += a.a[i]/MOD;
a.a[i] %= MOD;
}
if(a.a[len+1]) len++;
a.len = len;
}
void print(Bignum &a)
{
int i;
printf("%d",a.a[a.len]);
for(i = a.len-1; i>0; i--) printf("%08d",a.a[i]);
}
int main()
{
// fr();
int i,j,f,n,k,num[105];
while(~scanf("%d%d",&n,&k))
{
ans.len = 0;
MS(ans.a,0);
MS(dp,0);
for(i = 0; i < n; i++)
{
scanf("%d",&num[i]);
dp[i][1].a[1] = dp[i][1].len = 1;
}
for(i = 1; i < n; i++)
{
for(j = 0; j <= i-1; j++)
{
if(num[i] > num[j])
{
for(f = 2; f <= k; f++)
{
add(dp[i][f],dp[j][f-1]);
}
}
}
}
for(i = 0; i < n; i++)
{
add(ans,dp[i][k]);
}
print(ans);
puts("");
}
}