zoukankan      html  css  js  c++  java
  • URAL 1658. Sum of Digits(DP)

    题目链接

    隔了一年零三个月,重新刷URAL,这题挺麻烦的输出路径。输出路径挺扯的,乱写了写乱改改就A了。。。我本来想用很靠谱,记录每一条路径的,然后输出最小的,结果Tle,然后我使劲水水又过了一组,发现别人的题解。。直接来了一次 就过了。。我乱搞了搞,倒着记录最小的,然后倒着输出,就过了。。。

     1 #include <cstring>
     2 #include <cstdio>
     3 #include <string>
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <vector>
     7 #include <queue>
     8 using namespace std;
     9 #define INF 10000000
    10 int dp[901][8101];
    11 int pre[901][8101];
    12 int s[1010];
    13 struct node
    14 {
    15     int a,b;
    16 };
    17 void spfa()
    18 {
    19     int i,a,b;
    20     queue<node> que;
    21     node temp,u,v;
    22     for(i = 1; i < 10; i ++)
    23     {
    24         temp.a = i;
    25         temp.b = i*i;
    26         dp[i][i*i] = 1;
    27         pre[i][i*i] = i;
    28         que.push(temp);
    29     }
    30     while(!que.empty())
    31     {
    32         u = que.front();
    33         a = u.a;
    34         b = u.b;
    35         que.pop();
    36         if(a > 900) continue;
    37         if(b > 8100) continue;
    38         for(i = 1; i < 10; i ++)
    39         {
    40             v.a = i+a;
    41             v.b = i*i+b;
    42             if(i + a > 900) continue;
    43             if(i*i + b > 8100) continue;
    44             if(dp[v.a][v.b] > dp[u.a][u.b] + 1)
    45             {
    46                 pre[v.a][v.b] = i;
    47                 dp[v.a][v.b] = dp[u.a][u.b] + 1;
    48                 que.push(v);
    49             }
    50         }
    51     }
    52     return ;
    53 }
    54 
    55 int main()
    56 {
    57     int t,n,m,i,j;
    58     int top;
    59     for(i = 1; i <= 900; i ++)
    60     {
    61         for(j = 1; j <= 8100; j ++)
    62         {
    63             dp[i][j] = INF;
    64             pre[i][j] = INF;
    65         }
    66     }
    67     spfa();
    68     scanf("%d",&t);
    69     top = 0;
    70     while(t--)
    71     {
    72         scanf("%d%d",&n,&m);
    73         if(n > 900||m > 8100)
    74         {
    75             printf("No solution
    ");
    76             continue;
    77         }
    78         else if(dp[n][m] > 100)
    79         {
    80             printf("No solution
    ");
    81             continue;
    82         }
    83         int top = 0;
    84         while(n&&m)
    85         {
    86             i = pre[n][m];
    87             s[top++] = i;
    88             n = n - i;
    89             m = m - i*i;
    90         }
    91         for(i = top-1;i >= 0;i --)
    92         printf("%d",s[i]);
    93         printf("
    ");
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    墙内正确安装docker和docker-compose的方法
    VS2015编译ncnn
    caffe模型转ncnn模型
    Ncnn-Installation-on-Windows
    CV2 Fourcc解析
    手动安装OpenCV下的IPP加速库
    Ubuntu下安装Caffe
    Linux安装CUDA教程参考
    最正确的姿势安装cudnn,网上大多数教程都太坑了
    安装多版本cuda时,nvcc和cuda版本不一致问题
  • 原文地址:https://www.cnblogs.com/naix-x/p/3297558.html
Copyright © 2011-2022 走看看