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都改名了,还是不能解决