第一问很水,最长下降子序列
第二问很麻烦,我不会做,不仅要考虑每一种情况,还要判重,第一次找别人的题解,居然是错代码,当时我那个悲剧啊,第二次找了位大神的,代码很简洁,所以仿照他的写了一遍代码,也是有点模糊的懂,算了先挂在这里吧
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define maxN 5010
int dp[maxN],key[maxN],num[maxN];
int max(int x,int y){return x>y?x:y;}
int main()
{
int a,b,k,i,j,n;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&key[i]);
dp[i]=num[i]=1;
for(j=i-1;j>=0;j--)
{
if(key[j]>key[i])
{
if(dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
num[i]=num[j];
}
else if(dp[i]==dp[j]+1)
num[i]+=num[j];
}
}
for(j=i-1;j>=0;j--)
{
if(key[i]==key[j])
num[j]=0;
}
}
int max_n=0;
int tnum=0;
for(i=0;i<n;i++)
if(dp[i]>max_n)
max_n=dp[i];
for(i=0;i<n;i++)
if(dp[i]==max_n)
tnum+=num[i];
printf("%d %d\n",max_n,tnum);
}
}