zoukankan      html  css  js  c++  java
  • zzuli 1430 多少个0

    https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1430

    1430: 多少个0

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 322  Solved: 82

    SubmitStatusWeb Board

    Description

    一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次只能选择向下或者向右移动一格两种移动方式,让所有经过的格子中的数字相乘,求使最后的结果中末尾处0的数字最少。

    Input

    第一行是一个正整数n(0<n<100)

    接下来n行是一个n*n的矩阵。

    Output

    一个正整数m,表示最后的结果末尾处最少有m0

    Sample Input

    4 2 5 2 5 5 2 5 2 2 5 5 5 2 2 2 2

    Sample Output

     
    欸一开始都没看完题就开始bfs真是醉了,后来写了个dp一直WA,自己写的数据都能过,后来看题解说格子数固定的恍然大悟!
    本来就是想两个dp出2,5的最大个数,但是苦于不知道如何计算一共走个几个格子无法下手,看完之后发现是啊,题目说了只能向下或者向右走,
    从左上角到右下角的话必然横着走n个竖着走n个经过的格子就是(n*2-1)个,这样就好办了!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define CIN(a) scanf("%d",&a)
    #define COUT(a) printf("%d ",a)
    #define ql(a) memset(a,0,sizeof(a))
    #define FOR(i,a,b) for(i=a;i<=b;++i)
    int main()
    {
    int dp5[105][105],dp2[105][105],e[105][105];
    int n,m,i,j,maxn;
    while(CIN(n)!=EOF){ql(dp2),ql(dp5);
    maxn=0;int k1,k2;
    FOR(i,1,n)
       FOR(j,1,n) CIN(e[i][j]);
    FOR(i,1,n)
        FOR(j,1,n){int c=0;
    if(e[i][j]==2) ++c;
    dp2[i][j]=max(dp2[i-1][j],dp2[i][j-1])+c;
    }k1=min(dp2[n][n],n*2-1-dp2[n][n]);
    FOR(i,1,n)
        FOR(j,1,n){int c=0;
    if(e[i][j]==5) ++c;
    dp5[i][j]=max(dp5[i-1][j],dp5[i][j-1])+c;
    }k2=min(dp5[n][n],n*2-1-dp5[n][n]);
         COUT(min(k1,k2));
    }
    return 0;
    }

  • 相关阅读:
    Zookeeper实战
    Zookeeper的结构和命令
    Zookeeper中的选举机制
    du 命令,对文件和目录磁盘使用的空间的查看
    rm命令
    linux之cp/scp命令+scp命令详解
    android 为应用程序创建桌面快捷方式技巧分享
    对自己的文件使用keystore签名
    Android 打包签名 从生成keystore到完成签名 -- 转
    Android App启动错误的问题(connection to the server was unsuccessful)
  • 原文地址:https://www.cnblogs.com/zzqc/p/6656438.html
Copyright © 2011-2022 走看看