HDU 4301 Divide Chocolate(DP)

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 }    
时间: 2024-10-15 04:54:10

HDU 4301 Divide Chocolate(DP)的相关文章

HDU 4745 Two Rabbits(DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意:n个数排成一个环.两个人AB初始时各自选定一个位置.每一轮A在顺时针方向选择一个位置,B在逆时针选择一个位置,且这两个人所选位置的数字相等,然后格子跳到新选的位置上.问最多进行多少轮?有一个限制为每次跳跃不能跨过以前自己曾经选过的格子. 思路:主要是分析问题的本质.其实就是求最长回文子列.f[i][j]为[i,j]的最长回文子列,则答案为max(f[1][i],f[i+1][n]). i

HDU 4833 Best Financing (DP)

Best Financing Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29    Accepted Submission(s): 3 Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dat

HDU 1260:Tickets(DP)

Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 923    Accepted Submission(s): 467 Problem Description Jesus, what a great movie! Thousands of people are rushing to the cinema. However,

hdu 1421 搬寝室 (dp)

思路分析: dp[i][j] 表示选取到第 i 个   组成了 j 对的最优答案. 当然排序之后 选取相邻两个是更优的. if(i==j*2) dp[i][j] = dp[i-2][j-1] + w[i]-w[i-2]^2.. else if( i> j*2 ) dp[i][j] = min (dp[i-2][j-1] + ...^2   ,    dp[i-1][j]).... #include <cstdio> #include <iostream> #include &

HDU 1159——Common Subsequence(DP)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23279    Accepted Submission(s): 10242 Problem Description A subsequence of a given sequence is the given sequence with some e

HDU 3237 Help Bubu(DP)

题目链接:点击打开链接 思路: 比赛时查一点出, 需要加一个优化才能防止超时(恶心), 状态很容易想到: d[i][j][s][k]表示前i本书拿了j本没拿的书的集合是s没拿的书的最后一本是k的最优解. 为什么状态压缩的是目前桌子上的书的集合呢?  因为我们要防止一种情况:那就是如果对于高度为H的一种书, 我们都拿走了, 那么还要放回桌子上, 最优解要+1, 这样表示之后, 我们只要判断一下有几种书桌子上没有就行了. 细节参见代码: #include <cstdio> #include <

HDU 4301 Divide Chocolate DP

题目链接~http://acm.hdu.edu.cn/showproblem.php?pid=4301 非原创,看了好几个大神的题解,才看懂 代码::刚开始看bin神的,看了半天没看懂,我太菜了  %>_<% 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 /* 5 dp[i][j][0] 表示前i行出现了j部分 且第i行那两个不是一部分的 6 dp[i][j][1] 表示前i行出现了j部

HDU 5791:Two(DP)

http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description Alice gets two sequences A and B. A easy problem comes. How many pair of sequence A' and sequence B' are same. For example, {1,2} and {1,2} are same. {1,2,4} and {1,4,2} are not s

hdu 1176 免费馅饼(DP)

题意: 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接.但由于小径两侧都不能站人,所以他只能在小径上接.由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼. 为了使问题简化,假设在接下来的一段时间