zoukankan      html  css  js  c++  java
  • 幸运数字(数位dp)

    个人心得:数位dp处理起来是真的麻烦,本来动态规划就够头疼的了,菜的一批。

    来看这个题目吧,题目在下面。

    把题目变成可以求得就是求前n个数中1-n*9的情况的总和,所以用dp【i】【j】,表示前i个数中和为j的个数。

    状态转移方程就是

    dp[i][j]=dp[i-1][j-k]  0=<k<=9;

    但是后面要注意前导为0的情况所以总和ans=(dp[i][j]-dp[i-1][j])*dp[i][j](后面N段不需要考虑前导为0的情况,前面前导为0的情况就是前n-1位中和为j的值)

    脑瓜子还是不行呀!!!数位dp看了基本绕路走。。。。

    1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码。
    例如:99、1230、123312是幸运号码。
    给出一个N,求长度为2N的幸运号码的数量。由于数量很大,输出数量 Mod 10^9 + 7的结果即可。
    Input
    输入N(1<= N <= 1000)
    Output
    输出幸运号码的数量 Mod 10^9 + 7
    Input示例
    1
    Output示例
    9
     1 #include<iostream>
     2 #include<cstring>
     3 #include<string>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<cmath>
     7 #include<stack>
     8 #include<set>
     9 #include<queue>
    10 #include<algorithm>
    11 using namespace std;
    12 const long long mod=1000000007;
    13 long long  dp[1005][9999];
    14 int main()
    15 {
    16 
    17     memset(dp,0,sizeof(dp));
    18     dp[0][0]=1;
    19     int i,n;
    20     cin>>n;
    21     for(i=0;i<10;i++)
    22         dp[1][i]=1;
    23     for(i=2;i<=n;i++)
    24     for(int j=0;j<=9*i;j++){
    25         for(int k=0;k<=9;k++)
    26             {
    27                 if(j>=k)
    28                 dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
    29             }
    30     }
    31     long long ans=0;
    32     for(i=0;i<=n*9;i++)
    33          ans=(ans+dp[n][i]*(dp[n][i]-dp[n-1][i]))%mod;
    34     cout<<ans<<endl;
    35     return 0;
    36 }


  • 相关阅读:
    Spring用代码来读取properties文件
    单链表与双链表的区别
    为什么有些IP无法PING通但又能访问
    使用iperf3调试网络
    arm linux 移植 iperf3
    ZYNQ:PetaLinux工程更新HDF文件的脚本
    ZYNQ:使用PetaLinux打包 BOOT.BIN、image.ub
    ZYNQ:提取PetaLinux中Linux和UBoot配置、源码
    ZYNQ:使用 PetaLinux 构建Linux项目
    ZYNQ:使用SDK打包BOOT.BIN、烧录BOOT.BIN到QSPI-FLASH
  • 原文地址:https://www.cnblogs.com/blvt/p/7667688.html
Copyright © 2011-2022 走看看