NCD 2019題解C. Hasan and his lazy students【dp求lis,順序維護方案數】

題目鏈接

題意,給序列,求最長上升子序列長度和方案數。

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;}
		}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章