zoukankan      html  css  js  c++  java
  • (UVA)11361

    (UVA)11361 - Investigating Div-Sum Property

    思路:记忆化搜索;

    因为所有位置上的数字加起来和不会超过99的,所以k的有效值<100,所以当k>=100时,答案为0,

    然后dp[i][j][k][s],表示在状i下,前j位上数表示的数对mod取模为k,前j位各个数的和对mod取模为s下的方案数。

    i的状态一共只有两种,如果i为0则表示当前j-1位就为原数的前j-1为,那么当前位分两种情况,如果选原来的,那么i值不变就为0,如果选比原来小的,那么i在下一层变为1,那么剩下的所有位置上的数就可以选0--9的所有状态了,具体转移看代码。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<stdlib.h>
     5 #include<queue>
     6 #include<string.h>
     7 using namespace std;
     8 typedef long long LL;
     9 int dp[2][12][105][105];
    10 int ans[15];
    11 int N[10];
    12 int  slove(int  n,int  k);
    13 int dfs(int pos,int flag,int k,int sum,int mod);
    14 int t = 0;
    15 int main(void)
    16 {
    17         int T;
    18         scanf("%d",&T);
    19         int  A,B,K;
    20         N[0] = 1;
    21         int i ;
    22         N[1] = 10;
    23         for(i = 2; i <= 9; i++)
    24         {
    25                 N[i] = N[i-1]*10;
    26         }
    27         while(T--)
    28         {
    29                 scanf("%d %d %d",&A,&B,&K);
    30                 memset(dp,0,sizeof(dp));
    31                 if(K >= 100)
    32                 {
    33                         printf("0
    ");
    34                 }
    35                 else
    36                 {
    37                         printf("%d
    ",slove(B,K)-slove(A-1,K));
    38                 }
    39         }
    40         return 0;
    41 }
    42 int  slove(int  n,int  k)
    43 {
    44         int cn = 0;
    45         while(n)
    46         {
    47                 ans[++cn] = n%10;
    48                 n /= 10;
    49         }
    50         t = 0;
    51         memset(dp,-1,sizeof(dp));
    52         return dfs(cn,0,0,0,k);
    53 }
    54 int dfs(int pos,int flag,int k,int sum,int mod)
    55 {
    56         if(pos == 0)
    57         {
    58                 if(sum== 0&&k==0)
    59                 {
    60                         return 1;
    61                 }
    62                 else return 0;
    63         }
    64         if(dp[flag][pos][k][sum]!=-1)
    65         {
    66                 return dp[flag][pos][k][sum];
    67         }
    68         int ak = 0;
    69         if(flag)
    70         {
    71                 int i,j;
    72                 for(i = 0; i <= 9; i++)
    73                 {
    74                         int ss = dfs(pos-1,flag,(((k-N[pos-1]*i)%mod+mod)%mod),((sum-i)%mod+mod)%mod,mod);
    75                         if(ss>0)ak+=ss;
    76                 }
    77         }
    78         else if(!flag)
    79         {
    80                 int i;
    81                 for(i = 0; i < ans[pos]; i++)
    82                 {
    83                         int dd= dfs(pos-1,flag^1,(((k-N[pos-1]*i)%mod+mod)%mod),((sum-i)%mod+mod)%mod,mod);
    84                         if(dd>0)ak+=dd;
    85                 }
    86                 int ss = dfs(pos-1,flag,(((k-N[pos-1]*ans[pos])%mod+mod)%mod),((sum-ans[pos])%mod+mod)%mod,mod);
    87                 if(ss>0)ak+=ss;
    88         }
    89         return dp[flag][pos][k][sum] = ak;
    90 }
    油!油!you@
  • 相关阅读:
    logdump命令使用
    centos 添加用户并赋予sudo权限
    ogg进程解析
    xxl-job-executor2.2.0添加为默认执行器(docker方式)
    mysql设置数据库默认编码和表名不区分大小写
    linux-curl工具使用
    docker通过dockerfile打java项目镜像
    通过shell检查服务并发送mail告警(shell监控脚本)
    esxi6.5安装教程
    Vmware Vcenter6.5 配置集群和主机
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5830568.html
Copyright © 2011-2022 走看看