zoukankan      html  css  js  c++  java
  • URAL1495. One-two, One-two 2(dp)

    1495

    牵扯一点数位 保存数的时候我是按2进制保存的 把1当作0算 把2当作1算 滚动数组

    dp[i][j][(g*10+j)%n] = min(dp[i][j][(g*10+j)%n],dp[i-1][1][g]*2+j-1,dp[i-1][2][g]*2+j-1) j取1,2   *2+j-1是因为我按二进制算的

    时限给出的2S就是给我这种毫无优化又笨又戳的代码的 跑了1.39s

    0xfffffff的范围 是2Y多 还是少用好了  太容易超了 

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 using namespace std;
     8 #define N 1000010
     9 #define INF 1e9
    10 #define LL long long
    11 LL dp[2][3][N];
    12 int o[33];
    13 int main()
    14 {
    15     int i,j,n,g,y;
    16     LL x = INF;
    17     cin>>n;
    18     if(n==1||n==2)
    19     {
    20         cout<<n<<endl;
    21         return 0;
    22     }
    23     int flag = 0;
    24     for(i = 1 ; i <= 2 ; i++)
    25         for(j = 0 ; j < n ; j++)
    26         dp[0][i][j] = dp[1][i][j] = INF;
    27     for(i = 1; i <= 2 ; i++)
    28     dp[1][i][i%n] = i-1;
    29     for(i = 2; i <= 30 ; i++)
    30     {
    31         for(j = 1; j <= 2 ; j++)
    32         {
    33             for(g = 0 ; g < n ; g++)
    34             {
    35                 if(dp[(i-1)%2][1][g]!=INF)
    36                 dp[i%2][j][(g*10+j)%n] = min(dp[i%2][j][(g*10+j)%n],dp[(i-1)%2][1][g]*2+j-1);
    37                 if(dp[(i-1)%2][2][g]!=INF)
    38                 dp[i%2][j][(g*10+j)%n] = min(dp[i%2][j][(g*10+j)%n],dp[(i-1)%2][2][g]*2+j-1);
    39                 if((g*10+j)%n==0&&dp[i%2][j][0]!=INF)
    40                 {
    41                     flag = 1;
    42                     if(x>dp[i%2][j][0])
    43                     {
    44                         x = min(x,dp[i%2][j][0]);
    45                         y = i;
    46                     }
    47                 }
    48             }
    49         }
    50         if(flag) break;
    51     }
    52     if(!flag)
    53     puts("Impossible");
    54     else
    55     {
    56         g = 0;
    57         while(x)
    58         {
    59             o[++g] = x%2+1;
    60             x/=2;
    61         }
    62         for(i = 1 ; i <= y-g ; i++)
    63         cout<<"1";
    64         for(i = g;i >= 1; i--)
    65         cout<<o[i];
    66     }
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    C51学习笔记
    Keil C51与Keil ARM共存
    keil c51笔记
    css实现三角形
    微信小程序倒计时实现
    微信小程序公共组件的引用与控制
    mac上查找nginx安装位置
    charles抓取移动端app数据
    封装react组件——三级联动
    前端基础(http协议相关篇)
  • 原文地址:https://www.cnblogs.com/shangyu/p/3543307.html
Copyright © 2011-2022 走看看