2017 百度之星复赛 01、03、05

01、

  有个易错点,我卡了好久,就是 1(012)#(1) 答案是1012,我刚开始把012的前导0去掉了。。。

03、

  原题

05、

  数位DP,记忆化搜索

  dp[ p ][ q ][ limit ][ ceng ]:表示前一位是 p,前面处于递增(递减)状态q,当前位上限是多少limit,还有多少位ceng .

  根据不同情况递归即可,可以先不写记忆化,先写暴力的,最后加上记忆化。

  

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define Mod 1000000007
 4 #define LL long long
 5 LL dp[105][11][11][2];
 6
 7 LL dfs(int p, int q, int limit, int ceng){
 8     if(ceng==0){
 9         return 1;
10     }
11     if(dp[ceng][p+1][limit][q]!=-1) return dp[ceng][p+1][limit][q];
12
13     LL ret = 0;
14     for(int i=0; i<limit; i++){
15         if(q==0){  // 递减
16             if(p==-1 || i <= p) {
17                 if(p==-1 && i==0){
18                     ret += dfs(-1, 0, 10, ceng-1);
19                 } else
20                     ret += dfs(i, 0, 10, ceng-1);
21             } else {
22                 ret += dfs(i, 1, 10, ceng-1);
23             }
24         } else {
25             if(i < p) continue;
26             ret += dfs(i, 1, 10, ceng-1);
27         }
28         ret %= Mod;
29     }
30
31     dp[ceng][p+1][limit][q]=ret;
32     return ret;
33 }
34
35 int main(){
36     memset(dp, -1, sizeof(dp));
37     char n[105];
38     int t;
39     scanf("%d", &t);
40     while(t--){
41         scanf("%s", &n);
42         LL ans = 0;
43         int len = strlen(n);
44         int u = 0;
45         for(int i=0; i<len; i++){
46             int limit = n[i]-‘0‘;
47             int p = i==0?-1:n[i-1]-‘0‘;
48
49             if(u==2) break;
50
51             ans += dfs(p, u, limit, len-i);
52             ans %= Mod;
53
54             if(u==0){
55                 if(i!=0 && limit>p){
56                     u=1;
57                 }
58             } else if(u==1){
59                 if(limit<p){
60                     u=2;
61                 }
62             }
63         }
64         printf("%I64d\n", ( (ans - 1 + (u==2?0:1) ) % Mod + Mod ) % Mod );
65     }
66     return 0;
67 }
时间: 2024-10-13 15:37:24

2017 百度之星复赛 01、03、05的相关文章

2017百度之星复赛1003Pok&#233;mon GO------hdu6146

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=6146 分析:这道题有点麻烦啊!貌似是原题,讨论情况好恶心啊. 1.首先呢,我们考虑从左上角出发,先从左往右抓到底,再从右往左抓,因为题目要的是步数最少的,所以不能随便      走.每一步选择有2种可能,所以总的方案数是 b[i] = 2^i (i为列数) 2.我们可以第一列抓完,再抓第二列,也从左上角开始,到第二列有两种可能,到上面的格子和到下面的格子,所以 方案数是  2 * a[i-1] (

2017百度之星复赛1001Arithmetic of Bomb------hdu6144

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6144 分析:这道题挺水的,就是讲(a)#(b)表示有b个相连的a,当然也有可能有穿插不是这样表示直接给数字的,比如题目的(12)#(2)4(2)#(3)表示12124222,照着模拟就行了,注意下要到处取模,要不可能出现溢出啥的 代码如下: #include<bits/stdc++.h> using namespace std; typedef long long LL; const LL mod

2017&quot;百度之星&quot;程序设计大赛 - 复赛1005&amp;&amp;HDU 6148 Valley Numer【数位dp】

Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 311    Accepted Submission(s): 165 Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过去数字没有出现先递增接

2017&quot;百度之星&quot;程序设计大赛 - 复赛1003&amp;&amp;HDU 6146 Pok&#233;mon GO【数学,递推,dp】

Pokémon GO Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 171    Accepted Submission(s): 104 Problem Description 众所周知,度度熊最近沉迷于 Pokémon GO. 今天它决定要抓住所有的精灵球! 为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都

2017&quot;百度之星&quot;程序设计大赛 - 复赛1001&amp;&amp;HDU 6144 Arithmetic of Bomb【java大模拟】

Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 129    Accepted Submission(s): 94 Problem Description 众所周知,度度熊非常喜欢数字. 它最近在学习小学算术,第一次发现这个世界上居然存在两位数,三位数……甚至N位数! 但是这回的算术题可并不简单,由于

HDU 6113 度度熊的01世界 【DFS】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 400 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0

hdu 6082 度度熊与邪恶大魔王(2017&quot;百度之星&quot;程序设计大赛 - 资格赛 )

度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 251    Accepted Submission(s): 125 Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来.邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力.度度熊一共拥有m种攻击方式,第i

(最小费用流)hdu 6118(2017百度之星初赛B 1005) 度度熊的交易计划

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 260    Accepted Submission(s): 83 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

2016百度之星复赛 1003 拍照 优先队列

2016"百度之星" - 复赛(Astar Round3) Ended 2016-05-29 14:00:00 - 2016-05-29 17:00:00 Current Time: 00:46:02 Solved Pro.ID Title Ratio(Accepted / Submitted) Language   1001 D++游戏 13.79% (16/116) 中文   1002 K个联通块 17% (136/800) 中文 1003 拍照 22.49% (434/1930)