此代码AC
#include<bits/stdc++.h>
using namespace std;
const int N=10090+5,K=505,lit=5500+5;
int sum[lit][K];
int f[N][K];
int h[N],m;
void add(int x,int y,int v)
{
for(;x<=lit;x+=(x&-x))
{
int k=y;
for(;k<=m+1;k+=(k&-k))
sum[x][k]=max(sum[x][k],v);
}
}
int find(int x,int y)
{
int res=0;
for(;x;x-=(x&-x))
{
int k=y;
for(;k;k-=(k&-k))
res=max(res,sum[x][k]);
}
return res;
}
int main()
{
int n;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m+1;j++)
f[i][j]=find(h[i]+j,j)+1;
for(int j=1;j<=m+1;j++)
add(h[i]+j,j,f[i][j]);
}
printf("%d",find(lit,m+1));
return 0;
}
此代码只AC第一个点,其余全WA
#include<bits/stdc++.h>
using namespace std;
const int N=10000+5,K=505,lit=5500+5;
int sum[lit][K];
int f[N][K];
int h[N],m;
void add(int x,int y,int v)
{
for(;x<=lit;x+=(x&-x))
{
int k=y;
for(;k<=m+1;k+=(k&-k))
sum[x][k]=max(sum[x][k],v);
}
}
int find(int x,int y)
{
int res=0;
for(;x;x-=(x&-x))
{
int k=y;
for(;k;k-=(k&-k))
res=max(res,sum[x][k]);
}
return res;
}
int main()
{
int n;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m+1;j++)
f[i][j]=find(h[i]+j,j)+1;
for(int j=1;j<=m+1;j++)
add(h[i]+j,j,f[i][j]);
}
printf("%d",find(lit,m+1));
return 0;
}
只改了个N的大小,但是 明明比题目的大小要大啊,而且把N改的太大也会RE, MIHUO
#include<bits/stdc++.h>
using namespace std;
const int N=10500+5,K=505,lit=5500+5;
int sum[lit][K];
int f[N][K];
int h[N],m;
void add(int x,int y,int v)
{
for(;x<=lit;x+=(x&-x))
{
int k=y;
for(;k<=m+1;k+=(k&-k))
sum[x][k]=max(sum[x][k],v);
}
}
int find(int x,int y)
{
int res=0;
for(;x;x-=(x&-x))
{
int k=y;
for(;k;k-=(k&-k))
res=max(res,sum[x][k]);
}
return res;
}
int main()
{
int n;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m+1;j++)
f[i][j]=find(h[i]+j,j)+1;
for(int j=1;j<=m+1;j++)
add(h[i]+j,j,f[i][j]);
}
printf("%d",find(lit,m+1));
return 0;
}