永恒之2

Smiling & Weeping

                     ---- 鱼说,你看不到我眼中的泪,

                          因为我在水里。

                        水说,我能感觉到你的泪,

                          因为你在我的心里。

 

 题目链接:https://www.matiji.net

思路:其实题目说的很明白这道题目就是一道数位DP,把十进制改成十六进制,计算出现过多少次二

吐槽:全天人不在线,迷惑性bug层出不穷,还是要认真演算程序框架思路啊,[○・`Д´・ ○]

Talk is cheap , show me the code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mode = 99999989;
 5 const int maxn = 200;
 6 ll dp[maxn][maxn];
 7 char ch[maxn];
 8 map<char , int> num1;
 9 int num[maxn];
10 ll dfs(int pos , int sum , bool lead , bool limit)
11 {
12     ll ans = 0;
13     if(pos == 0) return sum;
14     if(!lead && !limit && dp[pos][sum] != -1)   return dp[pos][sum];
15     int up = (limit ? num[pos] : 15);
16     for(int i = 0; i <= up; i++)
17     {
18         if(i == 0 && lead) ans += dfs(pos-1 , sum , true , limit&& i == up) , ans %= mode;
19         else if(i == 2) ans += dfs(pos-1 , sum+1 , false , limit&& i == up) , ans %= mode;
20         else if(i != 2) ans += dfs(pos-1 , sum , false , limit&& i == up) , ans %= mode;
21     }
22     if(!lead && !limit) dp[pos][sum] = ans%mode;
23     return ans%mode;
24 }
25 inline int read_occ(char c)
26 {
27     if(isdigit(c))
28         return c-'0';
29     else 
30         return c-'A'+10;
31 }
32 ll solve(ll a)
33 {
34     int len = a;
35     for(int i = a; i >= 1; i--)
36         num[i] = read_occ(ch[i]);
37     for(int i = 1; i <= a; i++)
38         cout << num[i] << " ";
39     memset(dp , -1 , sizeof(dp));
40     return dfs(len , 0 , true , true )%mode;
41 }
42 int main()
43 {
44     ll a , ans=0;
45     scanf("%lld",&a);
46     scanf("%s",ch+1);
47     ch[0] = 0;
48     printf("%s",ch);
49     ans = solve(a);
50     printf("%lld\n",ans);
51     return 0;
52 }

代码有些乱,还请见谅,⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

青山不改,绿水长流,文章到此结束,我们下次再见。

posted @ 2023-08-04 17:45  smiling&weeping  阅读(19)  评论(0)    收藏  举报