WA on #13 求助
查看原帖
WA on #13 求助
688783
SilverLi楼主2023/8/18 11:10
#include <iostream>
#include <utility>
#include <vector>
#define a first
#define b second
#define int long long
using namespace std;
const int N = 1e3 + 5;
int n, a[N][N];
pair<int, int> t[N][N];
pair<int, int> f[N][N];
vector<char> from[N][N];
pair<int, int> operator + (pair<int, int> x, pair<int, int> y) {
    return { x.a + y.a, x.b + y.b };
}
signed main() {
    cin >> n;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j) {
            cin >> a[i][j];
            int x = a[i][j];
            while (x % 2 == 0) {
                ++t[i][j].a;
                x /= 2;
            }
            while (x % 5 == 0) {
                ++t[i][j].b;
                x /= 5;
            }
        }
    f[1][1] = t[1][1];
    for (int i = 2; i <= n; ++i) {
        f[1][i] = f[1][i - 1] + t[1][i];
        from[1][i] = from[1][i - 1];
        from[1][i].push_back('R');
    }
    for (int i = 2; i <= n; ++i) {
        f[i][1] = f[i - 1][1] + t[i][1];
        from[i][1] = from[i - 1][1];
        from[i][1].push_back('D');
    }
    for (int i = 2; i <= n; ++i)
        for (int j = 2; j <= n; ++j) {
            pair<int, int> x = f[i - 1][j] + t[i][j];
            pair<int, int> y = f[i][j - 1] + t[i][j];
            if (min(x.a, x.b) < min(y.a, y.b) ||
                (min(f[i - 1][j].a, f[i - 1][j].b) == min(f[i][j - 1].a, f[i][j - 1].b)&&
                    (x.a == y.a && x.b < y.b) || (x.b == y.b && x.a < y.a))) {
                f[i][j] = f[i - 1][j] + t[i][j];
                from[i][j] = from[i - 1][j];
                from[i][j].push_back('D');
            }
            else {
                f[i][j] = f[i][j - 1] + t[i][j];
                from[i][j] = from[i][j - 1];
                from[i][j].push_back('R');
            }
        }
    cout << min(f[n][n].a, f[n][n].b) << '\n';
    for (char i : from[n][n])
        cout << i;
    return 0;
}

2023/8/18 11:10
加载中...