help!!卡在了动规找最优解的路径上,帮帮我
查看原帖
help!!卡在了动规找最优解的路径上,帮帮我
580890
weiaizhaoqun楼主2022/1/21 14:00
/*这个题我想的是分三步:
第一步先是求出他的第一次走完全部路程找到那个最大值,这个我在程序里已经实现了能求出正确的解,使用了动态规划的算法思维。
第二步我是想自己写一种数据结构就是下面的road类型,里面存放着两个数组,x与y按顺序组合成(x,y)代表着到达现在位置的路径
现在我就是卡在了第二步。
第三步就是将第一次跑完的路径上的数字清零,最后再按照第一部的过程跑一遍就行了
但是第二步的数组我一直没维护好,现在问题是数组下标越界,还有数组结果和预期不一样
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 9
typedef struct{
 int x[2*N-1];
 int y[2*N-1];
}road;
void scpy(int*,const int*);
int funtion(int n);
int max(int ,int );
int main()
{
    int n,score;
    scanf("%d",&n);
    score = funtion(n);
    printf("%d",score);
    return 0;
}
int funtion(int n)//实现主要功能
{
    road r[n][n];//建立一个二维的存储结构
    int i,j,k;
//    for(i=0;i<N;i++)
//    {
//        for(j=0;j<N;j++)
//        {
//            for(k=0;k<2*N-1;k++)
//            {
//                r[i][j].x[k]=0;
//                r[i][j].y[k]=0;
//            }
//        }
//    }
    int a[n][n];
    int x,y,z;
    int judge;
    judge=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            a[i][j]=0;
        }
    }//先初始化地图数组
    do
    {
        scanf("%d%d%d",&x,&y,&z);
    if(x==0&&y==0&&z==0);
    else
        a[x][y]=z;
    if(x==0&&y==0&&z==0)
        judge=1;
    }while(judge==0);//按题目要求初始化初值
//    for(i=0;i<N;i++)
//    {
//        for(j=0;j<N;j++)
//        {
//            for(k=0;k<2*N-1;k++)
//            {
//                r[i][j].x[k]=0;
//                r[i][j].y[k]=0;
//            }
//        }
//    }
    int f[n][n];
    int sum1=0;
    int sum2=0;
    for(i=0;i<n;i++)
    {
        sum1+=a[i][0];
        f[i][0]=sum1;//初始化dp数组边界初值便于之后递推
        if(i!=0)
        {
            scpy(r[i][0].x,r[i-1][0].x);
            scpy(r[i][0].y,r[i-1][0].y);
            scpy(r[0][i].x,r[0][i-1].x);
            scpy(r[0][i].y,r[0][i-1].y);
            r[i][0].x[i]=i;
            r[i][0].y[i]=0;
            r[0][i].x[i]=0;
            r[0][i].y[i]=i;
        }
        else{
        r[0][0].x[0]=0;
        r[0][0].y[0]=0;
        }
        sum2+=a[0][i];
        f[0][i]=sum2;
    }
    for(i=1;i<n;i++)
    {
        for(j=1;j<n;j++)
        {
            f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];//转移方程
            if((f[i][j]-a[i][j])==f[i-1][j])
            {
                scpy(r[i][j].x,r[i-1][j].x);
                scpy(r[i][j].y,r[i-1][j].y);
                r[i][j].x[i+j]=i;
                r[i][j].y[i+j]=j;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%2d",a[i][j]);
        }
        printf("\n");
    }//这个方便我看程序有没有问题
    for(i=0;i<2*n-1;i++)
    {
        printf("(%d,%d)\n",r[n-1][n-1].x[i],r[n-1][n-1].y[i]);
    }
    return f[n-1][n-1];
}
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
        return b;
}
void scpy(int*a,const int*b)
{
    int i;
    for(i=0;i<2*N-1;i++)
    {
        a[i]=b[i];
    }
    return ;
}
2022/1/21 14:00
加载中...