记忆化搜索 得不到最优解 求调
查看原帖
记忆化搜索 得不到最优解 求调
328060
MCHEYH楼主2023/11/28 08:15
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1050,inf = (1<<30);
int n,a[maxn][maxn],f[maxn][maxn],fore[maxn][maxn][2];
int ans = inf;
void dfs(int x,int y,int n2,int n5,int fx,int fy,bool flag){
    if((x == n+1 && y == n) || (x == n && y == n+1)){
        ans = min(ans,f[n][n]);
        return;
    }
    if(x>n||y>n)return;
    int A = a[x][y];
    if(a[x][y] == 0) flag = true;
    if(!flag){
        while(!(A%5)){
            n5++;
            A/=5;
        }
        A = a[x][y];
        while(!(A%2)){
            n2++;
            A/=2;
        }
    }
    int Cnt0 = (flag?1:min(n2,n5)); // This square
    if(Cnt0 >= f[x][y])return;
    f[x][y] = Cnt0;
    fore[x][y][0] = fx,fore[x][y][1] = fy;
    dfs(x+1,y,n2,n5,x,y,flag);
    dfs(x,y+1,n2,n5,x,y,flag);
}

void print(int x,int y){
    if(!fore[x][y][0] || !fore[x][y][1])return;
    print(fore[x][y][0],fore[x][y][1]);
    cout << (fore[x][y][0] == x?"R":"D");
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n;
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=n;j++){
            cin >> a[i][j];
        }
    }
    memset(f,0x3f,sizeof f);
    dfs(1,1,0,0,0,0,0);
    cout << ans << endl;
    print(n,n);
    return 0;
}
2023/11/28 08:15
加载中...