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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P2467 [SDOI2010]地精部落

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2467 [SDOI2010]地精部落 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P2467 [SDOI2010]地精部落

題意:

有n個(gè)山脈高度分別是1到n,現(xiàn)在讓你按照山峰山谷的順序依次擺放(第一個(gè)可以是山峰也可以是山谷),問有多少方案(答案mod p)

題解:

dp,但是自己推不出來
這個(gè)博客講的非常詳細(xì),方案也非常多
我就先將第一個(gè)方案:
我們先去看這個(gè)波動(dòng)序列有什么性質(zhì)?

  • 在一個(gè)波動(dòng)序列中,如果i-1與i不相鄰,交換i-1與i即可得到一個(gè)新的波動(dòng)序列
  • 把長(zhǎng)度為n的一個(gè)波動(dòng)序列中的數(shù)字ai變成(n+1)-ai,會(huì)得到一個(gè)新的波動(dòng)序列,且新波動(dòng)序列的山峰和山谷與原序列相反
  • 我們根據(jù)這兩個(gè)性質(zhì)開始推狀態(tài)與轉(zhuǎn)移
    設(shè)dp[i][j]表示由i個(gè)數(shù)(1~i)組成,且第一個(gè)數(shù)是j,且j為山峰(即第一個(gè)會(huì)大于第二個(gè))的波動(dòng)序列數(shù)
    我們現(xiàn)在考慮哪些會(huì)給dp[i][j]做貢獻(xiàn)
    如果j-1與j不相鄰,由性質(zhì)1可知,交換j-1和j會(huì)得到新的序列,這些序列就是以j?1開頭的所有波動(dòng)序列,且這些序列與交換前的序列一一對(duì)應(yīng),所以有貢獻(xiàn)dp[i][j-1]表示以j開頭的一些波動(dòng)序列可以由以j?1開頭的波動(dòng)序列轉(zhuǎn)移過來
    如果j-1與j相鄰,我們既然規(guī)定了j是山峰,那么j-1就是山谷。此時(shí)我們考慮性質(zhì)2的貢獻(xiàn),對(duì)于i個(gè)數(shù)組成序列,第一位是j,還有i-1位的長(zhǎng)度未確定,那么長(zhǎng)度為i-1,以j-1開頭,且j-1為山谷的序列會(huì)貢獻(xiàn)答案,但是我們這一直統(tǒng)計(jì)山峰哪來山谷?山谷相反就是山峰,所以以(i-1+1)-(j-1)即i-j+1開頭且i-j+1為山峰的序列數(shù)相同,所以再加上一個(gè)dp[i-1][i-j+1]
    所以有dp[i][j]=dp[i][j?1]+dp[i?1][i?j+1]dp[i][j]=dp[i][j-1]+dp[i-1][i-j+1]dp[i][j]=dp[i][j?1]+dp[i?1][i?j+1]
    最后答案是2?∑i=2ndp[n][i]2*\sum_{i=2}^{n}dp[n][i]2?i=2n?dp[n][i](以1開頭構(gòu)不成波動(dòng)序列,因?yàn)槲覀円?guī)定了第一個(gè)是山峰,如果1開頭無(wú)法是山峰,但是以1開頭的情況也會(huì)被計(jì)算其中,所以不用擔(dān)心漏了)

    代碼:

    #include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b); using namespace std; typedef long long ll; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll=1e18; const int INF_int=0x3f3f3f3f; inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //計(jì)時(shí)開始freopen("in.txt","r",stdin);#endif } void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //計(jì)時(shí)結(jié)束printf("\n運(yùn)行時(shí)間為:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif } ll f[2][5000]; int main() {//rd_test();int n;ll p;cin>>n>>p;f[0][2]=1;for(int i=3;i<=n;i++){for(int j=2;j<=i;j++){f[i&1][j]=(f[i&1][j-1]+f[(i-1)&1][i-j+1])%p;}}int sum=0;for(int i=2;i<=n;i++)sum=(sum+f[n&1][i])%p;printf("%d\n",(sum<<1)%p); return 0;//Time_test(); }

    總結(jié)

    以上是生活随笔為你收集整理的P2467 [SDOI2010]地精部落的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。