码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4301 Divide Chocolate(DP)

时间:2017-11-17 23:29:52      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:space   巧克力   targe   std   clu   ref   names   can   for   

http://acm.hdu.edu.cn/showproblem.php?pid=4301

题意:

有一块n*2大小的巧克力,现在某人要将这巧克力分成k个部分,每个部分大小随意,问有多少种分法。

 

思路:

dp [ i ] [ j ] [ 0/1 ]表示到第 i 列时分成 j 块的方案数,0/1表示第 i 列的两格巧克力是否相连。

这样的话,分析到第 i 块时的情况如下:

①块数不变

dp[i][j][1] = dp[i][j][1] + dp[i-1][j][0]*2
dp[i][j][0] = dp[i-1][j][0]

②块数+1

dp[i][j][1] = dp[i-1][j-1][0] + dp[i-1][j-1][1]
dp[i][j][0] = dp[i-1][j-1][0]*2 + dp[i-1][j-1][1]*2

③块数+2

dp[i][j][0] = dp[i-1][j-2][1] + dp[i-1][j-2][0]

最后加起来即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int mod = 100000007;
 5 
 6 
 7 int n, k;
 8 int dp[1005][2005][2];
 9 
10 int main()
11 {
12     dp[1][1][1] = 1;
13     dp[1][1][0] = 0;
14     dp[1][2][1] = 0;
15     dp[1][2][0] = 1;
16     for(int i=2;i<=1000;i++)
17     {
18         for(int j=1;j<=2*i;j++)
19         {
20             dp[i][j][1] += dp[i-1][j][1] + dp[i-1][j][0]*2;
21             dp[i][j][1]%=mod;
22             dp[i][j][0] += dp[i-1][j][0];
23             dp[i][j][0]%=mod;
24             dp[i][j][1] += dp[i-1][j-1][0] + dp[i-1][j-1][1];
25             dp[i][j][1]%=mod;
26             dp[i][j][0] += dp[i-1][j-1][1]*2 + dp[i-1][j-1][0]*2;
27             dp[i][j][0]%=mod;
28             if(j>2)
29             {
30                 dp[i][j][0] += dp[i-1][j-2][1] + dp[i-1][j-2][0];
31                 dp[i][j][0]%=mod;
32             }
33         }
34     }
35     int T;
36     scanf("%d",&T);
37     while(T--)
38     {
39         scanf("%d%d",&n,&k);
40         printf("%d\n",(dp[n][k][0]+dp[n][k][1])%mod);
41     }
42     return 0;
43 }    

 

HDU 4301 Divide Chocolate(DP)

标签:space   巧克力   targe   std   clu   ref   names   can   for   

原文地址:http://www.cnblogs.com/zyb993963526/p/7853737.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!