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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Even Three is Odd

發布時間:2024/7/19 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Even Three is Odd 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

問題是對于所有的長度為n,且$1<=ai<=n$的整數序列求?$\prod_{i=1}^{n-2}{max \{w_i,w_{i+1},w_{i+2}}\}$ 之和。

?

解法:

首先設dp狀態為 $f(i,j,k)$ ,長度為$i+3$的,最大值為k,且最大值出現的位置集合為j的序列的乘積和。

顯然可以由 $f(i-1,j2,k2)$ 轉移到 $f(i,j,k)$,做前綴和優化,總效率$O(n^2 * 2^6)$

重新設計dp狀態,改變j的定義,j表示最大值最后出現的位置。

這樣對于狀態 $f(i,j,k)$,我們確定了長度為$i+j$的序列的值,并且確定了$a(i+j+1)...a(i+2)<k$ 。

假設之前的三個數字最大值為$k2$,之后的最大值為k,這樣的的話只要分為 $k>k2, k<k2, k=k2$ 討論即可得出答案。

再加以前綴和優化,總效率$O(n^2)$。

?

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 #define LL long long 6 #define N 2010 7 #define P 1000000007LL 8 9 using namespace std; 10 11 int n; 12 LL w[N],S[N],S2[N],f[N][3][N]; 13 14 LL sum(LL S[],int l,int r) 15 { 16 if(l>r) return 0LL; 17 LL ans = S[r]+P-S[l-1]; 18 if(ans>=P) ans-=P; 19 return ans; 20 } 21 22 int main() 23 { 24 // freopen("test.txt","r",stdin); 25 while(~scanf("%d",&n)) 26 { 27 for(int i=1;i<=n;i++) scanf("%lld",&w[i]); 28 for(int i=0;i<=n-2;i++) 29 for(int k=1;k<=n;k++) 30 f[i][0][k]=0, f[i][1][k]=0, f[i][2][k]=0; 31 for(int x1=1;x1<=n;x1++) 32 for(int x2=x1;x2<=n;x2++) f[0][2][x2]++; 33 for(int x1=1;x1<=n;x1++) f[0][1][x1]=1; 34 for(int i=1;i<=n-2;i++) 35 { 36 for(int k=1;k<=n;k++) 37 { 38 S[k] = S[k-1] +f[i-1][0][k]; 39 S2[k] = S2[k-1]+f[i-1][0][k]*(k-1)*(k-1); 40 S2[k] += f[i-1][1][k]*(k-1); 41 S2[k] += f[i-1][2][k]; 42 } 43 for(int k=1;k<=n;k++) 44 { 45 f[i][2][k] += sum(S2,1,k-1); 46 f[i][1][k] += f[i-1][2][k]; 47 f[i][0][k] += f[i-1][1][k]; 48 f[i][2][k] += f[i-1][0][k]*(k-1)*(k-1); 49 f[i][2][k] += f[i-1][1][k]*(k-1); 50 f[i][2][k] += f[i-1][2][k]; 51 f[i][0][k] += sum(S,k+1,n); 52 f[i][1][k] += sum(S,k+1,n)*k; 53 f[i][2][k] += sum(S,k+1,n)*k*k; 54 f[i][0][k] = f[i][0][k]%P * w[k]%P; 55 f[i][1][k] = f[i][1][k]%P * w[k]%P; 56 f[i][2][k] = f[i][2][k]%P * w[k]%P; 57 } 58 } 59 LL ans=0; 60 for(int k=1;k<=n;k++) 61 { 62 ans += f[n-2][0][k]*(k-1)*(k-1); 63 ans += f[n-2][1][k]*(k-1); 64 ans += f[n-2][2][k]; 65 ans %= P; 66 } 67 cout << ans << endl; 68 } 69 return 0; 70 } View Code

?

轉載于:https://www.cnblogs.com/lawyer/p/6444890.html

總結

以上是生活随笔為你收集整理的Even Three is Odd的全部內容,希望文章能夠幫你解決所遇到的問題。

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