标签:10 ch const ZJOI2008 int 聚会 生日 include dp
此题一看就是一个dp题。
首先我们设dp[i][j]表示前 i 个人中有 j 个男生(这和dp[i][j]表示 i 个男生 j 个女生等价),然而当我们转移到dp[i + 1][j + 1]或dp[i + 1][j]时,限制条件没有用上。所以要再加两维dp[i][j][x][y]表示前 i 个人中有 j 个男生,其中男生最多比女生多个,女生最多比男生多y个。
这样很容易得出转移方程
dp[i + 1][j + 1][x + 1][y - 1] += dp[i][j][x][y],
dp[i + 1][j][x - 1][y + 1] += dp[i][j][x][y]
但是当y或是x已经是0的时候,那还应该是0
dp[i + 1][j + 1][x + 1][max(y - 1, 0)] += dp[i][j][x][y],
dp[i + 1][j][max(x - 1, 0)][y + 1] += dp[i][j][x][y]
还有一件事我也不太懂,就是为啥dp[i][j][x][y]要从右面转移,而不是有的状态转移到dp[i][j][x][y]……巨佬们求助啊
![](http://www.icode9.com/i/li/?n=4&i=images/blog/202105/28/334f91f2bcda739f616d7675236c4535.gif?,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
![](http://www.icode9.com/i/li/?n=4&i=images/blog/202105/28/bba444e725227017d14bda03c9acd6a8.gif?,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #include<vector> 8 #include<queue> 9 #include<stack> 10 #include<cctype> 11 using namespace std; 12 #define enter puts("") 13 #define space putchar(' ') 14 #define Mem(a) memset(a, 0, sizeof(a)) 15 typedef long long ll; 16 typedef double db; 17 const int INF = 0x3f3f3f3f; 18 const db eps = 1e-8; 19 const int maxn = 155; 20 const int mod = 12345678; 21 inline ll read() 22 { 23 ll ans = 0; 24 char ch = getchar(), last = ' '; 25 while(!isdigit(ch)) last = ch, ch = getchar(); 26 while(isdigit(ch)) ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar(); 27 if(last == '-') ans = -ans; 28 return ans; 29 } 30 inline void write(ll x) 31 { 32 if(x < 0) putchar('-'), x = -x; 33 if(x >= 10) write(x / 10); 34 putchar(x % 10 + '0'); 35 } 36 37 int n, m ,k; 38 int dp[maxn << 1][maxn][21][21], ans = 0; 39 40 int main() 41 { 42 n = read(); m = read(); k = read(); 43 dp[0][0][0][0] = 1; 44 for(int i = 0; i < n + m; ++i) 45 for(int j = 0; j <= n; ++j) 46 for(int x = 0; x <= k; ++x) 47 for(int y = 0; y <= k; ++y) 48 { 49 if(!dp[i][j][x][y]) continue; 50 if(j + 1 <= n && x + 1 <= k) dp[i + 1][j + 1][x + 1][max(y - 1, 0)] += dp[i][j][x][y] %= mod; 51 if(y + 1 <= k) dp[i + 1][j][max(x - 1, 0)][y + 1] += dp[i][j][x][y] %= mod; 52 } 53 for(int i = 0; i <= k; ++i) 54 for(int j = 0; j <= k; ++j) 55 ans = (ans + dp[n + m][n][i][j]) % mod; 56 write(ans); 57 return 0; 58 }View Code
标签:10,ch,const,ZJOI2008,int,聚会,生日,include,dp 来源: https://blog.51cto.com/u_15234622/2830901
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。