洛谷P1091题解兼2019.09.13 日常总结

洛谷P1091:

【题意】:从一个序列中删除一些数,使得剩下的数满足有某个i(1 \leq i \leq k),k为剩下数的个数,满足a_1 < a_2 < a_ 3 < ... <a_i>a_{i+1}>a_{i+2}>...>a_k,且删除的数最少。求最少要删除多少个数。

【思路】:删除的数最少,即保留的数最多。把剩下的数的序列分为两块,即a_1 < a_ 2 < a_3 < ... < a_ia_i > a_{i + 1} > a_{i + 2} > ... > a_k。因为要最多,所以我们分别求两块的最大值,即记f[i]为以i结尾的最长上升子序列的长度(对应a_1 < a_ 2 < a_3 < ... < a_i),记g[i]为以i为开头的最长下降子序列的长度(对应a_i > a_{i + 1} > a_{i + 2} > ... > a_k)。那么包括i的队列的最长长度即为f[i] + g[i] - 1,减一是因为i被重复算了两次。最终的答案即为max \{ g[i] + f[i] - 1 \} (1 \leq i \leq n)

【代码】:

//By HPXXZYY
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N=120;
int f[N],g[N],n;
int i,j,ans,a[N];
int main(){
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		f[i]=g[i]=1;
	}
	for(i=1;i<=n;i++)
	for(j=1;ji;j--)
	if (a[j]

 

你可能感兴趣的:(原创)