国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Attack on Titans ZOJ - 3747 DP

2019-11-08 18:50:40
字體:
來源:轉載
供稿:網友

題目鏈接:Attack on Titans ZOJ - 3747

三種士兵,G、R、P,有序排成總人數為n 的隊伍,其中要有至少m個G連續,至多k個R連續,求有多少種排列方案。

至少m個連續不好計算,但是至多m個連續好計算,只要保證沒有m個以上的連續出現就好了。那么至少m個 == 至多n個-至多m-1個

dp[i][j]:=前i個士兵,第i個為G(R,P)時,滿足至多m個G連續,至多k個R連續的方案數為dp[i]0; sum = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]; 那么,如果i<=m時,無論前面怎么擺放,第i個都可以放G,dp[i][0] = sum; 如果i==m+1,那么,前面有一種情況是1-m全是G,其他情況都可以放G,所以只需要減去第一種情況,dp[i][0] = sum - 1; 如果i>m+1,則需要減去i-m 到 i-1這一段是連續的G的情況dp[i][0] = sum - dp[i-m-1][1] - dp[i-m-1][2]

對于R同理

p沒有限制條件,放哪里都可,直接等于sum

由于方案數太大,需要對1000000007取模,wa了兩次,因為在兩個結果相減的時候沒有加上MOD再對MOD取模,導致可能出現負數,以后遇到取模后的數字相減或者其他減法,都加上一個MOD在取模保證不會出錯

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const ll MAXN = 1000000 + 100, MOD = 1000000007;ll n, m, k, dp[MAXN][3]; //GRP G>=m, R<=kll f(int m, int k)//g<=m, r<=k;{ memset(dp[0], 0, sizeof(dp[0])); dp[0][0] = 1; for(int i=1; i<=n; ++i) { ll sum = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%MOD; if(i<=m) dp[i][0] = sum; else if(i == m+1) dp[i][0] = (sum-1+MOD)%MOD; else dp[i][0] = ((sum - dp[i-m-1][1] - dp[i-m-1][2])%MOD+MOD)%MOD; if(i<=k) dp[i][1] = sum; else if(i == k+1) dp[i][1] = (sum-1+MOD)%MOD; else dp[i][1] = ((sum - dp[i-k-1][0] - dp[i-k-1][2])%MOD+MOD)%MOD; dp[i][2] = sum; } return (dp[n][0] + dp[n][1] + dp[n][2]) % MOD;}int main(){ while(cin >> n >> m >> k) cout << (f(n, k) - f(m-1, k) + MOD)%MOD << endl; return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白山市| 乌审旗| 翁牛特旗| 定襄县| 太和县| 琼结县| 随州市| 清丰县| 正定县| 广元市| 榆树市| 庆安县| 葫芦岛市| 石城县| 抚远县| 抚顺县| 杭州市| 宁陕县| 武夷山市| 金塔县| 敦化市| 梅河口市| 广元市| 柏乡县| 兖州市| 黄大仙区| 德阳市| 晋城| 阿尔山市| 富阳市| 高碑店市| 盐山县| 工布江达县| 平顶山市| 治县。| 西城区| 安溪县| 璧山县| 天水市| 尼玛县| 格尔木市|