• codeforces2B


    题意:给你一个矩阵,问你从左上角走一直走到右下角只能向右向下,问你最后乘起来尾数0个数最少的数值和路径是什么

    解题思路:可以知道 要么这条路径上和 的质因子  2 的个数 < 5的个数, 要么 5的个数 < 2 的个数,所以就在一个节点里面添加两个信息,一种是2最小 ,一种是5最小,

    最开始没注意看数据  莫名 RE 31组数据,然后发现有0,这里特判一下就行了,写了200行也是给自己跪了。

    解题代码:

      1 // File Name: 2b.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年08月02日 星期六 15时17分39秒
      4 
      5 #pragma comment(linker, "/STACK:102400000,102400000")
      6 #include<vector>
      7 #include<list>
      8 #include<map>
      9 #include<set>
     10 #include<deque>
     11 #include<stack>
     12 #include<bitset>
     13 #include<algorithm>
     14 #include<functional>
     15 #include<numeric>
     16 #include<utility>
     17 #include<sstream>
     18 #include<iostream>
     19 #include<iomanip>
     20 #include<cstdio>
     21 #include<cmath>
     22 #include<cstdlib>
     23 #include<cstring>
     24 #include<ctime>
     25 #pragma comment(linker, "/STACK:102400000,102400000")
     26 #define LL long long
     27 using namespace std;
     28 #pragma comment(linker, "/STACK:102400000,102400000")
     29 
     30 struct node2{
     31     LL n2 ; 
     32     LL n5 ;
     33     bool d;
     34 };
     35 struct node{
     36    node2 m[2]; 
     37 }dp[1004][1004];
     38 LL l2[100];
     39 LL l5[100];
     40 int nl2;
     41 int nl5;
     42 void init()
     43 {
     44    memset(dp,0,sizeof(dp));
     45    l2[1] = 2; 
     46    l5[1] = 5;
     47    for(int i = 2;;i ++)
     48    {
     49       l2[i] = l2[i-1]*2;
     50       if(l2[i] > 1e9)
     51       {
     52          nl2 = i ; 
     53          break;
     54       }
     55    }
     56    for(int i = 2;;i ++)
     57    {
     58       l5[i] = l5[i-1]*5;
     59       if(l5[i] > 1e9)
     60       {
     61          nl5 = i ; 
     62          break;
     63       }
     64    }
     65 }
     66 void solve(int x,int y ,LL t)
     67 {
     68     int t2 ; 
     69     int t5 ;
     70     for(int i =1 ;;i ++)
     71     {
     72        if(t % l2[i] != 0 )
     73        {
     74            t2 = i-1;
     75            break;
     76        }
     77     }
     78     for(int i =1 ;;i ++)
     79     {
     80        if(t % l5[i] != 0 )
     81        {
     82            t5 = i-1;
     83            break;
     84        }
     85     }
     86     dp[x][y].m[0].n2 = t2;
     87     dp[x][y].m[0].n5 = t5;
     88     dp[x][y].m[1] = dp[x][y].m[0];
     89 }
     90 int num;
     91 bool ans[2000004] = {0};
     92 bool d;
     93 void findway(int x, int y )
     94 {
     95     num --;
     96     if((x == 1 && y == 1))
     97         return;
     98     
     99     if(dp[x][y].m[d].d)
    100     {
    101       ans[num] = 1;
    102       findway(x,y-1);
    103       return;
    104     }else{
    105       findway(x-1,y);
    106       return;
    107     }
    108 }
    109 void dp_clear(int x, int y)
    110 {
    111     dp[x][y].m[0].n2 = 1e9;
    112     dp[x][y].m[0].n5 = 1e9;
    113     dp[x][y].m[0].d = 0;
    114     dp[x][y].m[1] = dp[x][y].m[0];
    115 }
    116 LL a[1005][1005];
    117 int main(){
    118    int n ;
    119    init();
    120    scanf("%d",&n);
    121    num = 2*n-1;
    122    int ok = 0;
    123    int x, y;
    124    for(int i = 1;i <= n;i ++)
    125        for(int j = 1;j <= n ;j ++ )
    126        {
    127 
    128           LL temp ; 
    129           scanf("%I64d",&a[i][j]);
    130           if(a[i][j] != 0 )
    131             solve(i,j,a[i][j]);
    132           else{
    133             ok = 1;
    134             x = i; 
    135             y = j;
    136           }
    137        }
    138    for(int i = 2;i <= n;i ++)
    139    {
    140       dp[1][i].m[0].n2 = dp[1][i-1].m[0].n2 + dp[1][i].m[0].n2;
    141       dp[1][i].m[0].n5 = dp[1][i-1].m[0].n5 + dp[1][i].m[0].n5;
    142       dp[1][i].m[0].d = 1; 
    143       dp[1][i].m[1] = dp[1][i].m[0]; 
    144    }
    145    for(int i = 2;i <= n;i ++)
    146    {
    147       dp[i][1].m[0].n2 = dp[i-1][1].m[0].n2 + dp[i][1].m[0].n2;
    148       dp[i][1].m[0].n5 = dp[i-1][1].m[0].n5 + dp[i][1].m[0].n5;
    149       dp[i][1].m[1] = dp[i][1].m[0]; 
    150    }
    151    for(int i =2;i <= n;i ++)
    152        for(int j = 2;j <= n;j ++)
    153        {
    154            if(a[i][j] == 0 )
    155            {
    156              dp_clear(i,j);
    157              continue;
    158            }
    159            if(dp[i-1][j].m[0].n2 < dp[i][j-1].m[0].n2)
    160            {
    161                dp[i][j].m[0].n2 += dp[i-1][j].m[0].n2;
    162                dp[i][j].m[0].n5 += dp[i-1][j].m[0].n5;
    163            }else{
    164                dp[i][j].m[0].n2 += dp[i][j-1].m[0].n2;
    165                dp[i][j].m[0].n5 += dp[i][j-1].m[0].n5;
    166                dp[i][j].m[0].d = 1; 
    167            }
    168            if(dp[i-1][j].m[1].n5 < dp[i][j-1].m[1].n5)
    169            {
    170                dp[i][j].m[1].n2 += dp[i-1][j].m[1].n2;
    171                dp[i][j].m[1].n5 += dp[i-1][j].m[1].n5;
    172            }else{
    173                dp[i][j].m[1].n2 += dp[i][j-1].m[1].n2;
    174                dp[i][j].m[1].n5 += dp[i][j-1].m[1].n5;
    175                dp[i][j].m[1].d = 1; 
    176            }
    177        }
    178    LL T = min(min(dp[n][n].m[0].n2,dp[n][n].m[0].n5),min(dp[n][n].m[1].n2,dp[n][n].m[1].n5));
    179    if(ok)
    180    {
    181       if(T!= 0 )
    182       {
    183         printf("1
    ");
    184         for(int i = 1;i < x;i ++)
    185             printf("D");
    186         for(int i = 1;i < n;i ++)
    187             printf("R");
    188         for(int i = x+1;i <=n;i ++)
    189             printf("D");
    190         printf("
    ");
    191         return 0 ; 
    192       }
    193    }
    194    printf("%I64d
    ",T);
    195    d = 0; 
    196    if(min(dp[n][n].m[0].n2,dp[n][n].m[0].n5) > min(dp[n][n].m[1].n2,dp[n][n].m[1].n5))
    197    { 
    198        d = 1;
    199        findway(n,n);
    200    }
    201    else findway(n,n);
    202    for(int i = 1;i <= 2*n-2;i++)
    203        if(ans[i])
    204            printf("R");
    205        else printf("D");
    206    printf("
    ");
    207 return 0;
    208 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    Android学习笔记(四十):Preference的使用
    怎样在小方框上打对号 小方框内打对勾 word 方框打对勾
    PreTranslateMessage作用和用法
    MyBatis与Spring设置callSettersOnNulls
    EJB3.0开发环境的搭建
    经常使用虚拟现实仿真软件总汇(zz)
    slf自己主动绑定实现类过程推断
    DLNA介绍(包含UPnP,2011/6/20 更新)
    从技术到管理的问题
    NOI第一天感想&小结
  • 原文地址:https://www.cnblogs.com/zyue/p/3887235.html
Copyright © 2020-2023  润新知