P2467 [SDOI2010]地精部落
P2467 [SDOI2010]地精部落
題意:
有n個(gè)山脈高度分別是1到n,現(xiàn)在讓你按照山峰山谷的順序依次擺放(第一個(gè)可以是山峰也可以是山谷),問有多少方案(答案mod p)
題解:
dp,但是自己推不出來
這個(gè)博客講的非常詳細(xì),方案也非常多
我就先將第一個(gè)方案:
我們先去看這個(gè)波動(dòng)序列有什么性質(zhì)?
我們根據(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P2469 [SDOI2010]星际竞速
- 下一篇: 2021牛客暑期多校训练营5