大佬进来看看!把数组声明放到结构体前面就不对了??

P1434 [SHOI2002] 滑雪

DongHuangZhong @ 2020-04-01 21:11:51

//这是题解里面的一个答案,我的和他的差不多,但一直过不了最后一个测试
//我就反复对比,然后好像找出了一个BUG ,把数组声明放到std后面就错了?? 
//请大佬看看怎么回事????? 
#include<iostream>
#include<queue>
using namespace std;
//int n,m,maxn,maxj,maxi,w,top=0,g[101][101],f[101][101];//把下面的声明注释,解除这里的封印,你会发现新大陆 
struct node{
    int i,j,num,f;
};//结构体存点
struct cmp1{
    bool operator()(node x,node y){
        return x.num>y.num;
    }
};//优先队列小的在前面
priority_queue<node,vector<node>,cmp1>q;//stl大法好
int n,m,maxn,maxj,maxi,w,top=0,g[101][101],f[101][101];//把这行注释,留上面的!!!!!!! 
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            f[i][j]=1;//长度最开始为1,它自己
            cin>>g[i][j];
            node a;
            a.i=i;a.j=j;a.f=0;a.num=g[i][j];
            q.push(a);//入队
        }
    }
    while(!q.empty()){
        node now1=q.top();//取点
        int i=now1.i;
        int j=now1.j;//坐标
        int now=now1.num;//此点的权值
        q.pop();//出队
        if(g[i-1][j]<now) f[i][j]=max(f[i][j],f[i-1][j]+1);
            if(g[i+1][j]<now) f[i][j]=max(f[i][j],f[i+1][j]+1);
            if(g[i][j-1]<now) f[i][j]=max(f[i][j],f[i][j-1]+1);
            if(g[i][j+1]<now) f[i][j]=max(f[i][j],f[i][j+1]+1);//dp
            if(maxn<f[i][j]) maxn=f[i][j];//取最大值
    }
    cout<<maxn;//输出
    return 0;//第一篇题解,请多支持!
}

by Prean @ 2020-04-01 21:29:54

@DongHuangZhong 一个可能的原因

f[101][101]

struct node{
    int i,j,num,f;
};

应该不会有问题吧。。。(大雾)


by DongHuangZhong @ 2020-04-01 21:30:14

@limaopipi2022 自己定义的结构体,指定属性比较,能用greater吗?不太懂,我一直用的是自己写的


by Prean @ 2020-04-01 21:30:24

@老子是白菜 这边推荐去看一看洛谷词典呢


by songxiao @ 2020-04-01 21:30:48

随便口胡就60分?


by Prean @ 2020-04-01 21:30:59

@DongHuangZhong 应该可以直接在struct里面重载运算符


by 老子是北瓜 @ 2020-04-01 21:31:52

@Gorilla 高度的差不可能全是1的……


by Prean @ 2020-04-01 21:32:55

比如:

struct
{
    int x,y,num,f;
    inline bool operator<(Node a)
    {
        return num>a.num;
    }
};

by DongHuangZhong @ 2020-04-01 21:34:18

@老子是白菜 1的意思是这个点本身算一次,这个也不是重点,关键是代码的位置能决定错误还是正确??放到STD后面就错,这就好奇怪


by Doubeecat @ 2020-04-01 21:35:26

@DongHuangZhong 我这边提交了下 把上面注释去掉WA10 我个人感觉是意思相同的?(可能有错)我把我的代码给你吧

#include <cstdio>
#include <cctype>
#include <algorithm>
#define MAXN 110
using std::max;

inline int read() {
    int a = 0,f = 1;
    char v = getchar();
    while(!isdigit(v)) {
        if (v == '-') {
            f = -1;
        }
        v = getchar();
    }
    while (isdigit(v)) {
        a =a * 10 + v - 48;
        v = getchar();
    }
    return a * f;
}

int a[MAXN][MAXN],pre[MAXN][MAXN],n,m,ans;

int dfs(int x,int y) {
    if (pre[x][y]!=1)   return pre[x][y];
    int b = 0;
    if (x > 0 && y-1 > 0 && x <= n && y <= m && a[x][y] > a[x][y-1]) {
        b = max(b,(dfs(x,y-1)+1));
    }
    if (x > 0 && y > 0 && x <= n && y+1 <= m && a[x][y] > a[x][y+1]) {
        b = max(b,(dfs(x,y+1)+1));
    }
    if (x > 0 && y > 0 && x+1 <= n && y <= m && a[x][y] > a[x+1][y]) {
        b = max(b,(dfs(x+1,y)+1));
    }
    if (x-1 > 0 && y > 0 && x <= n && y <= m && a[x][y] > a[x-1][y]) {
        b = max(b,(dfs(x-1,y)+1));
    }
    pre[x][y] = max(b,pre[x][y]);
    return pre[x][y];
}

int main() {
    n = read(),m = read();
    for (int i = 1;i <= n;++i) {
        for (int j = 1;j <= m;j++) {
            a[i][j] = read();
            pre[i][j] = 1;
        }
    }
    for (int i = 1;i <= n;++i) {
        for (int j = 1;j <= m;j++) {
            ans = max(dfs(i,j),ans);
        }
    }
    printf("%d",ans);
    return 0;
}

by DongHuangZhong @ 2020-04-01 21:35:46

@limaopipi2022 这个原因我也考虑到了,我把f都改名了,还是不能解决


上一页 | 下一页