Codeforces Round #247 (Div. 2) C. k-Tree (dp)

题目链接

题意:

思路:


 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <algorithm>
6 using namespace std;
7 const int mo = 1000000000 + 7;
8 int dp[110][110][110];
9
10 int main()
11 {
12 int n, k, d, i, j, l, sum, ans;
13 while(cin>>n>>k>>d)
14 {
15 memset(dp, 0, sizeof(dp));
16 for(i = 1; i <= k; i++)
17 dp[0][i][i] = 1;
18 for(i = 1; i < n; i++)
19 {
20 for(l = 1; l <= k; l++)
21 for(sum = 1; sum <= 100; sum++)
22 {
23 if(dp[i-1][l][sum] == 0)
24 continue;
25 for(j = 1; j <= k; j++)
26 {
27 if(sum + j > n)
28 break;
29 if(j > l)
30 {
31 dp[i][j][sum+j] += dp[i-1][l][sum];
32 dp[i][j][sum+j] %= mo;
33 }
34 else
35 {
36 dp[i][l][sum+j] += dp[i-1][l][sum];
37 dp[i][l][sum+j] %= mo;
38
39 }
40 }
41 }
42 }
43 ans = 0;
44 for(j = 0; j < n; j++)
45 for(i = d; i <= 100; i++)
46 {
47 ans += dp[j][i][n];
48 ans %= mo;
49 }
50 printf("%d\n", ans);
51 }
52 return 0;
53 }

时间: 2024-10-14 13:59:07

Codeforces Round #247 (Div. 2) C. k-Tree (dp)的相关文章

Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)

题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列其中相邻两项差的绝对值的个数(指绝对值不同的个数)为k个.求序列. 思路:1~k+1.构造序列前段,之后直接输出剩下的数.前面的构造可以根据,两项差的绝对值为1~k构造. AC代码: #include <stdio.h> #include <string.h> int ans[200010]; bool vis[100010]; i

Codeforces Round #556 (Div. 2) - D. Three Religions(动态规划)

Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 3000 mSec Problem Description Input Output Sample Input 6 8abdabc+ 1 a+ 1 d+ 2 b+ 2 c+ 3 a+ 3 b+ 1 c- 2 Sample Output YESYESYESYESYESYESNOYES 题解:动态规划,意识到这个题是动态规划之后难点在于要优化什么东西,本题

Codeforces Round #124 (Div. 1) C. Paint Tree(极角排序)

C. Paint Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a tree with n vertexes and n points on a plane, no three points lie on one straight line. Your task is to paint

Codeforces Round #168 (Div. 1) B. Zero Tree 树形dp

题目链接: http://codeforces.com/problemset/problem/274/B 题意: 给出一棵树,每个点有权值,每次操作可以对一个联通子集中的点全部加1,或者全部减1,且每次操作必须包含点1,问最少通过多少次操作可以让整棵树每个点的权值变为0. 思路: http://blog.csdn.net/qq_24451605/article/details/48622953 定义状态up[u],down[u]代表点u被加操作的次数和点u被减操作的次数 因为必须包含点1,所以我

Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)

思路: dfs序其实是很水的东西.  和树链剖分一样, 都是对树链的hash. 该题做法是:每次对子树全部赋值为1,对一个点赋值为0,查询子树最小值. 该题需要注意的是:当我们对一棵子树全都赋值为1的时候, 我们要查询一下赋值前子树最小值是不是0, 如果是的话, 要让该子树父节点变成0, 否则变0的信息会丢失. 细节参见代码: #include <cstdio> #include <cstring> #include <algorithm> #include <i

Codeforces Round #256 (Div. 2) B. Suffix Structures(模拟)

题目链接:http://codeforces.com/contest/448/problem/B ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

[Codeforces Round #194 (Div. 2)] Secret 解题报告 (数学)

题目链接:http://codeforces.com/problemset/problem/334/C 题目: 题目大意: 给定数字n,要求构建一个数列使得数列的每一个元素的值都是3的次方,数列之和S大于n,且删掉数列中的任意一个元素数列之和都会小于n,最小化这个数列的长度 题解: 我们考虑从小到大枚举k,取最小的k,使得,答案就是$n/3^k+1$ 为什么呢? 我们考虑一个合法的数列,其中最小的元素是A,那么S一定是A的倍数.假设n是A的倍数,又S>n,那么S-A>=n,这样的话去掉A这个数

Codeforces Round #353 (Div. 2) C. Money Transfers (思维)

原题请戳这里 题意: n个银行成环形排列.每个银行有一定的余额ai,每次可以在任意相邻的银行间转账.问 最少需要经过多少次转账使得所有银行的余额都为0. 分析: 由于所有银行的余额总数为0,则若把整个环看成一段,需要n-1次使所有余额为0. 把ai分为k个sum=0的部分,每部分的长度为li,使每个部分所有银行清零需要li-1步.n个 银行清零总共需要n-k步. 因此即是求(n-k)min,那么k值越大越好. 考虑前缀和,若sum[i]==sum[j],则区间[i+1,j]必定和为0,且[j+1

Codeforces Round #275 (Div. 1)A. Diverse Permutation (水)

题意: 从1-n的数,让你选择一些数来构造,要求每个相邻的数之间的绝对值之差有k种 题解: 先放好一个1   然后往后面插数字   先满足绝对值不同的  然后全插绝对值为1的, 代码: #include<stdio.h> #include<string.h> int main() { int n, k, a[100005], mark[100005]; while(scanf("%d %d", &n, &k) != EOF) { memset(a

Codeforces Round #511 (Div. 2) C. Enlarge GCD (质因数)

题目 题意: 给你n个数a[1]...a[n],可以得到这n个数的最大公约数, 现在要求你在n个数中 尽量少删除数,使得被删之后的数组a的最大公约数比原来的大. 如果要删的数小于n,就输出要删的数的个数, 否则输出 -1 . 思路: 设原来的最大公约数为 g, 然后a[1]...a[n]都除以g ,得到的新的a[1]...a[n],此时它们的最大公约数一定是1 . 设除以g之后的数组a为: 1    2    3     6      8   10  则它们的质因数分别是:  1    2