题目

源地址:

http://codeforces.com/contest/2/problem/B

理解

比赛的时候没有做出来,一看就知道应该是一个DP,选取一个2或者5最少的路径。 首先处理一下,设TWO为0,FIVE为1。在输入的时候就进行判断,当前输入的数和’0’,’2’,’5’之间的关系。得到的结果存在一个数组中,这样就得到整个数组中最多的0的个数。然后对2和5的数量进行比较,只需要考虑比较少的那个。 然后对第一个数为0的情况进行特判,此时只要随手输出就可以了。如果第一个数不为0,则开始取2比较少的路径开始行走。

大概是我写得不是很优美= =,在提交的时候遇到了各种问题,debug了半天,还是没有找出究竟错在哪里。直到我脑洞一开,把所有变量的定义放在了main函数的里面,居然过了!过了!!了!!! 蛋疼,不知道问题到底在哪里= =,唉,存疑。

代码


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#include <functional>
#include <stdarg.h>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-4)
#define inf (1<<28)
#define ll long long int
using namespace std;

#define N 1100+10

const int TWO = 0;
const int FIVE = 1;

int main()
{
    int sum[N][N][2];
    int dir[N][N][2];
    char output[N*4];
    int n,i,j,k;
    ll tmp,ans;
    int x,y,n25[2];
    int len, type,nowx,nowy;
    bool ok;

    while(~scanf("%d",&n))
    {
        ok = false;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                scanf("%d",&tmp);
                if(tmp == 0)
                {
                    ok = true;
                    x = i,y = j;
                    n25[TWO] = n25[FIVE] = 1;
                }
                else
                {
                    n25[TWO] = n25[FIVE] = 0;
                    while(tmp %2 == 0)
                    {
                        n25[TWO]++;
                        tmp >>= 1;
                    }
                    while(tmp %5 == 0)
                    {
                        n25[FIVE]++;
                        tmp /= 5;
                    }
                }

                for(k=0; k<2; k++)
                {
                    if(!i && !j)
                    {
                        sum[i][j][k] = n25[k];
                    }
                    else if(j && i)
                    {
                        if(sum[i-1][j][k] < sum[i][j-1][k])
                        {
                            dir[i][j][k] = 1;
                            sum[i][j][k] = sum[i-1][j][k] + n25[k];
                        }
                        else
                        {
                            dir[i][j][k] = 0;
                            sum[i][j][k] = sum[i][j-1][k] + n25[k];
                        }
                    }
                    else if(!i)
                    {
                        dir[i][j][k] = 0;
                        sum[i][j][k] = sum[i][j-1][k] + n25[k];
                    }
                    else if(!j)
                    {
                        dir[i][j][k] = 1;
                        sum[i][j][k] = sum[i-1][j][k] + n25[k];
                    }
                }
            }
        }

        k = TWO;
        if(sum[n-1][n-1][TWO] > sum[n-1][n-1][FIVE]) k = FIVE;
        if(sum[n-1][n-1][k] > 1 && ok)
        {
            printf("1\n");
            for(int i = 0; i < x; i++) putchar('D');
            for(int j = 0; j < y; j++) putchar('R');
            for(int i = x; i < n-1; i++) putchar('D');
            for(int j = y; j < n-1; j++) putchar('R');
            putchar('\n');
        }
        else
        {
            printf("%d\n", sum[n-1][n-1][k]);
            output[2*n-2] = 0;
            for(i = n-1, j = n-1; i > 0 || j > 0; dir[i][j][k]?i--:j--)
                output[i+j-1] = dir[i][j][k]?'D':'R';
            printf("%s\n", output);
        }
    }
    return 0;
}

更新日志

  • 2014年11月3日 已AC。