【CF2B】少なくともラウンド方法 - DP

N×N非負整数の正方行列を考えると、あなたは道を見つける必要があります。

開始点として、左上隅

あなただけの右または下に行くことができます

エンドポイントとして右下へと、私たちは途中で発生数が乗算された場合、製品は最小限であるべき「ラウンド」、つまり、0の終了の最小数でなければなりません。

解決

最終的な答えのみに依存考慮して(2,5 \)\最小は、それは別として考えることができる多くの要因、それは単純な最小のパスDPであります

注元の行列がゼロ、との答えが含まれている場合は(\ 1)\取りmin、それを

#include <bits/stdc++.h>
using namespace std;

vector <int> pat;
int n,a[1005][1005],x[1005][1005],f[1005][1005],ans=1e+9;

void solve(int p) {
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++){
            a[i][j]=0;
            int t=x[i][j];
            while(t && t%p==0) t/=p, a[i][j]++;
        }
    }
    memset(f,0x3f,sizeof f);
    f[0][1]=0;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            f[i][j]=min(f[i-1][j],f[i][j-1])+a[i][j];
        }
    }
    /*for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) cout<<f[i][j]<<" ";
        cout<<endl;
    }*/
    vector <int> v;
    {
    int p=n,q=n;
    while(p!=1 && q!=1) {
        int i=p, j=q;
        if(f[i][j]==f[i-1][j]+a[i][j]) {
            v.push_back(1); //cout<<"up";
            --p;
        }
        else if(f[i][j]==f[i][j-1]+a[i][j]) {
            v.push_back(0); //cout<<"left";
            --q;
        }
        else cout<<"err";
    }
    while(p!=1) {
        --p;
        v.push_back(1);
    }
    while(q!=1) {
        --q;
        v.push_back(0);
    }
    reverse(v.begin(),v.end());
    if(f[n][n]<ans) {
        ans=f[n][n];
        pat=v;
    }
    }
}

int main() {
    scanf("%d",&n);
    int flag=0,posx,posy;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            scanf("%d",&x[i][j]);
            if(x[i][j]==0) flag=1,posx=i,posy=j;
        }
    }
    solve(2);
    solve(5);
    if(ans>1 && flag) {
        cout<<1<<endl;
        for(int i=1;i<posx;i++) cout<<"D";
        for(int i=1;i<posy;i++) cout<<"R";
        for(int i=posx;i<n;i++) cout<<"D";
        for(int i=posy;i<n;i++) cout<<"R";
        return 0;
    }
    cout<<ans<<endl;
    for(int i=0;i<pat.size();i++) {
        cout<<(pat[i]?"D":"R");
    }
}

おすすめ

転載: www.cnblogs.com/mollnn/p/12273813.html