忘川睡着了zZ 2023-03-10 21:20 采纳率: 66.7%
浏览 17
已结题

我这递归改的动态规划,为什么结果不一样


#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <stdlib.h>
using namespace std;
long process(int N,int M,int  row,int col,int K)
{
    if(row==N||col==M||row<0||col<0)
    {
        return 0;
    }
    if(K==0)
    {
        return 1;
    }
    long live=process(N,M,row+1,col,K-1);
    live+=process(N,M,row-1,col,K-1);
    live+=process(N,M,row,col+1,K-1);
    live+=process(N,M,row,col-1,K-1);
    return live;
}
long gcd(int n,int m)
{
    return m ==0?n:gcd(m,n%m);
}
string bob1(int N,int M,int row,int col,int K)
{
    long all=pow(4,K);
    long live=process(N,M,row,col,K);
    long num=gcd(all,live);
    double s=live/num+0.0;
    double n=all/num+0.0;
    double m=s/n*100;
    return "存活率为"+to_string(m)+"%";
}
long getvalue2(int N,int M,int row,int col,int K,long*** q);
long process2(int N,int M,int  row,int col,int K,long***q);
string bob2(int N,int M,int row,int col,int K)
{
    long ***q=new long**[K+1];
    for(int i = 0;i < K+1;i++)
    {
        q[i]=new long*[N];
    }
    for(int i = 0;i <K+1;i++) {
        for(int j = 0;j < N;j++) {
            q[i][j]=new long[M];
        }
    }
    long all=pow(4,K);
    long live=process2(N,M,row,col,K,q);
    long num=gcd(all,live);
    double s=live/num+0.0;
    double n=all/num+0.0;
    double m=s/n*100;
    for(int i = 0;i <K+1;i++) {
        for(int j = 0;j < N;j++) {
            delete[] q[i][j];
        }
    }
    for(int i = 0;i < K+1;i++)
    {
        delete[] q[i];
    }
    delete[] q;
    return "存活率为"+to_string(m)+"%";
}
long process2(int N,int M,int  row,int col,int K,long***q)
{
    for(int i = 0;i < K+1;i++) {
        for(int j = 0;j < 10;j++) {
            for(int c = 0;c < 9;c++) {
                q[i][j][c]+=getvalue2(N,M,j+1,c,i-1,q);
                q[i][j][c]+=getvalue2(N,M,j-1,c,i-1,q);
                q[i][j][c]+=getvalue2(N,M,j,c+1,i-1,q);
                q[i][j][c]+=getvalue2(N,M,j,c-1,i-1,q);
            }
        }
    }
    return q[K][row][col];
}
long getvalue2(int N,int M,int row,int col,int K,long*** q)
{
    if(row>=N||col>=M||row<=0||col<=0||K<0)
    {
        return 0;
    }
    if(K==0)
    {
        return 1;
    }
    return q[K][row][col];
}
int main(int argc, char** argv){
    cout<<bob2(10,9,5,6,10)<<endl;
    cout<<bob1(10,9,5,6,10);
    return 0;
}
  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-11 00:40
    关注

    代码太多了,请学会调式,主要是
    string bob2(int N,int M,int row,int col,int K)
    这里下断点,看看参数进来对不对

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥20 C# NetworkStream WriteAsync方法卡住无反应
  • ¥15 这个如何解决详细步骤
  • ¥15 在微信h5支付申请中,别人给钱就能用我的软件,这个的所属行业是啥?
  • ¥30 靶向捕获探针设计软件包
  • ¥15 别人给钱就能用我的软件,这个的经营场景是啥?
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker