M元上升子序列【树状数组+dp】
生活随笔
收集整理的這篇文章主要介紹了
M元上升子序列【树状数组+dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多元組-牛客網
題解
ac代碼
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int maxn=1e5+10; typedef long long ll; const int mod =1e9+7; ll n,m,a[maxn],b[maxn];//用來離散化 ll f[51][maxn];//動態規劃的數組 f[i][j]表示終點為a[j]的i元組上升序列的個數 ll t[maxn];//樹狀數組 //快讀 ll read(){ll k=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){k=10*k+c-'0';c=getchar();}return f*k; }//下面是樹狀數組的基本操作 ll lowbit(ll x ){return x&-x; } //樹狀數組更新 void update(ll i,ll k){while(i<=n){t[i]=(t[i]+k)%mod;i+=lowbit(i);} } //樹狀數組前綴和 ll query(ll i){ll res=0;while(i>0){res=(res+t[i])%mod;i-=lowbit(i); }return res; }int main(){ n=read(),m=read();for(int i=1;i<=n;i++){a[i]=read(),b[i]=a[i];}sort(b+1,b+n+1); unique(b+1,b+n+1);for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;//離散for(ll j=1;j<=n;j++) f[1][j]=1;//初始化for(ll i=2;i<=m;i++){//上升序列的長度 memset(t,0,sizeof(t));//樹狀數組清零 for(int j=1;j<=n;j++){f[i][j]=query(a[j]-1);//update(a[j],f[i-1][j]);}} ll ans=0;for(int i=1;i<=n;i++) ans+=f[m][i];printf("%d",ans%mod);} 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的M元上升子序列【树状数组+dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信用卡审批通过怎么查额度
- 下一篇: 算法基础课-动态规划-区间dp-AcWi