1. 程式人生 > >P1799——數列【NOI導刊】2010提高

P1799——數列【NOI導刊】2010提高

簡單 sin 今天 gic 回來 表示 std 操作 action

寫到哪博客就更到哪吧 樹的基本操作over掉了,今天轉回來看dp 應該會好理解一點了 至少沒有開始時那麽懵 那麽,action P1799 直接上解析嘍,簡單的一道dp 原諒我傻,一看題就只會一維dp,然而題解裏都是二維的 那還是一維吧 因為本題其實只與去掉的數的個數有關,所以一維就夠 如果已知去掉i-1個數時,最多有dp[i-1]個滿足條件, 那麽如果再去掉最後一個數,此時最多有dp[i-1]+1(當最後加進來的一個數剛好就是和他的次序數一致時)個數滿足條件 那麽代碼就很簡單了
#include<bits/stdc++.h>
using namespace std;
int a[1010],n,ans;
int dp[1010];//表示剩余j個時 
//最多能有  個滿足條件 
void init()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
}
void DP() 
{
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j>=1;j--)
			dp[j]=max(dp[j],dp[j-1]+(a[i]==j?1:0));
	}//然後,找到最大的
	for(int i=0;i<=n;i++) 
	ans=max(ans,dp[i]);
}
int main()
{
	init();
	DP();
	cout<<ans<<endl;
	return 0;
} 

  

P1799——數列【NOI導刊】2010提高