日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

$Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 $Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Luogu

?

Description

求一個長度為n的序列a的最長下降子序列的長度,以及這個長度的子序列種數,注意相同的幾個子序列只能算作一個子序列.

n<=5000,a[i]不超過long范圍

?

Sol

求最長下降子序列的長度: 1.f[i]表示以a[i]結尾的最長下降子序列長度

           ? 2.f[i]表示以i結尾的最長下降子序列長度

第一種適用于n比較小的,第二種則適用于n大而a[i]小的,這題顯然用第一種吧,而且第一種更方便計數

用num[i]表示以a[i]結尾的長度為f[i]的子序列個數

還需注意的是,這題要去重.

所以更新num[i]數組,j從1循環到i-1時,遇到a[i]==a[j]&&f[i]==f[j]的情況num[i]-=num[j]就好了

因為,在這樣的情況中,num[j]所記錄的子序列一定也被包含在num[i]中

?

Code

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define Rg register 5 #define il inline 6 #define db double 7 #define ll long long 8 #define mem(a,b) memset(a,b,sizeof(a)); 9 #define go(i,a,b) for(Rg int i=a;i<=b;++i) 10 #define yes(i,a,b) for(Rg int i=a;i>=b;--i) 11 using namespace std; 12 il int read() 13 { 14 int x=0,y=1;char c=getchar(); 15 while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();} 16 while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();} 17 return x*y; 18 } 19 const int N=5001; 20 int n,ans1,p[N],l[N];//price length 21 db ans2,nm[N];//number 22 int main() 23 { 24 n=read(); 25 go(i,1,n)p[i]=read(),l[i]=1; 26 go(i,1,n) 27 { 28 go(j,1,i-1)if(p[j]>p[i])l[i]=max(l[i],l[j]+1); 29 if(l[i]==1)nm[i]=1; 30 go(j,1,i-1) 31 { 32 if(p[i]==p[j]&&l[i]==l[j])nm[i]-=nm[j]; 33 if(p[j]>p[i]&&l[j]+1==l[i])nm[i]+=nm[j]; 34 } 35 } 36 go(i,1,n)if(l[i]>ans1)ans1=l[i]; 37 go(i,1,n)if(l[i]==ans1)ans2+=nm[i]; 38 printf("%d %.0lf\n",ans1,ans2); 39 return 0; 40 } View Code

?

?

轉載于:https://www.cnblogs.com/forward777/p/11010126.html

總結

以上是生活随笔為你收集整理的$Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。