20分dp,萌新求助qwq

P1434 [SHOI2002] 滑雪

Parsifa1 @ 2022-09-28 15:56:35

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int l[101][101],dp[101][101];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1},k;

struct node {
int num;
int x,y;
}a[10001];

int read() {          //偷的快读(
    int x=0;
    char ch=getchar();
    while(ch>'9'||ch<'0') {
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x;
}

bool cmp(node x,node y){
    return x.num<
    y.num;
}

int main() {
    int r,c,ans=0;
    r=read();
    c=read();

    for(int i=0;i<r;i++) {      //读入并储存到一维数组中以便排序
        for(int j=0;j<c;j++) {
            l[i][j]=read();
            a[k++].num=l[i][j];
            a[k].x=i;a[k].y=j;
        }

    }

    sort(a,a+k,cmp);

    for(int i=0;i<k;i++) {
        int x0=a[i].x,y0=a[i].y;
        for(int j=0;j<4;j++) {
            int x1=a[i].x+dx[j],y1=a[i].y+dx[j];
            if(x0>=0&&x0<r&&y0>=0&&y0<c) {
                if(l[x0][y0]<l[x1][y1]) {
                    dp[x0][y0]=max(dp[x1][y1]+1,dp[x0][x0]);                   
                }
            } 
        }
        ans = max(dp[x0][y0],ans);
    }
    cout<<ans+1;
}

by A_Big_Jiong @ 2022-09-28 17:59:14

代码

修改的地方有点多,我尽量回忆回忆,下面的行数参照你的代码

  1. k++的位置不对(39行),应当在所有数据存储完毕后再自加,你代码中自加在前面导致x, y和num并没有存在同一个a[i]中

  2. 50行: y1 计算错误,这种短的就不建议复制粘贴了qwq

  3. 51行: 应当是y1不超出边界,而不是y0。因为y0是你当前的点,不可能超出边界

  4. 52行: 你想用(x1, y1)来更新(x0, y0),所以说你应当使得(x1, y1) 低于(x0, y0),这样才满足更新的条件

  5. 53行:dp的方程右边写成dp[x0][x0]了qwq

  6. 不要在意我自己写了个max,没啥用

P.S. 记得写return 0;

应该是没了吧,再有我也想不起来了

贡?万岁qwq


by A_Big_Jiong @ 2022-09-28 18:00:21

我橙没了

呜呜呜~


by Parsifa1 @ 2022-09-28 18:48:24

@A_Big_Jiong 谢谢佬! 贡橙好捏


by Parsifa1 @ 2022-09-28 19:10:38

@A_Big_Jiong 有个小疑问,不知道说的对不对:

if(l[x0][y0]>l[x1][y1]) {
    dp[x0][y0]=max(dp[x1][y1]+1,dp[x0][y0]);}                   

dp[x0][y0]不是指到达(x0,y0)时的最长路径么 那是不是相当于我现在实现的是个上山的过程,所以才是 x0>x1?QAQ


by Parsifa1 @ 2022-09-28 19:19:14

@A_Big_Jiong 所以说实际上我讲比大小的cmp的符号变向也能ac! 谢谢你的引导@w@


|