90分救命!
  • 板块P1799 数列
  • 楼主zlinda
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/16 13:37
  • 上次更新2023/10/24 04:01:05
查看原帖
90分救命!
698678
zlinda楼主2023/1/16 13:37

二位dp数组过了

#include<bits/stdc++.h>
using namespace std;
int n,a[1010],dp[1010][1010],ans;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<i;j++)
		{
			if(j==0) 
			{
				if(a[i]==i-j) dp[i][j]=dp[i-1][j]+1;
				else dp[i][j]=dp[i-1][j];
			}
			else
			{
				if(a[i]==i-j) dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]+1);
				else dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
			}
		}
	}
	for(int i=1;i<=n;i++) ans=max(dp[n][i],ans);
	cout<<ans;
	return 0;
}

但是改成一维状态就只剩90了

#include<bits/stdc++.h>
using namespace std;
int n,a[1010],dp[1010],ans=-1e9;
int main()
{
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	dp[0]=0;
	for(int i=1;i<=n;i++)
	{
		dp[i]=-1e9;
		for(int j=0;j<i;j++) if(i-a[i]>=j-a[j]&&a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1);
		ans=max(dp[i],ans);
	}
	cout<<ans;
	return 0;
}
2023/1/16 13:37
加载中...