題意,給序列,求最長上升子序列長度和方案數。
n<=1000,因爲n小於1e3,所以可以使用複雜度爲n2的dp做法,然後使用一個結構體來維護方案數就行了:
先定義一個結構體,包含dp求lis基本的len,還有就是方案數cnt。
struct func
{
int len;
LL cnt;
};
int a[1001];
func dp[1001];
讀完數據和基礎初始化之後開始進行dp求lis,然後當找到
dp[j].len+1==dp[i].len
的時候就可以讓他們的方案數加起來了。最後的答案方案數就能很好取出來。
int MAX=1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<i;++j)
{
if(a[i]>a[j])
{
if(dp[j].len+1==dp[i].len){dp[i].cnt+=dp[j].cnt;dp[i].cnt%=mod1;}
if(dp[j].len+1>dp[i].len)
{
dp[i].len=dp[j].len+1;
dp[i].cnt=dp[j].cnt;
}
}
}
MAX=max(MAX,dp[i].len);
}
LL ans=0;
for(int i=1;i<=n;++i)
{
if(dp[i].len==MAX){ans+=dp[i].cnt;ans%=mod1;}
}