1711: 上升序列 (动态规划)

1711: 上升序列

时间限制: 1 Sec   内存限制: 128 MB
提交: 33   解决: 6
[ 提交][ 状态][ 讨论版]

题目描述

我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增(严格递增即相邻元素不存在相等的情况)。其中无论是修改前还是修改后,每个元素都必须是整数。 请输出最少需要修改多少个元素。

输入

第一行输入一个T(1≤T≤10)T (1 \leq T \leq 10)T(1T10),表示有多少组数据

每一组数据:

第一行输入一个N(1≤N≤105)N (1 \leq N \leq 10^5)N(1<N<100000)表示数列的长度

第二行输入N个数A1,A2,...,AnA_1, A_2, ..., A_n,每一个数列中的元素都是正整数而且不超过1e6.

输出

对于每组数据,先输出一行

Case #i:

然后输出最少需要修改多少个元素。

样例输入

2 2 1 10 3 2 5 4

样例输出

Case #1:
0
Case #2:
1
 
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define MAXN 100100
#define INF 0xfffffff
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
using namespace std;
int num[MAXN];
int dp[MAXN];
int main()
{
	int t,n;
	int i,j,M;
	int cas=0;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
			scanf("%d",&num[i]);
		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
		{
			M=-INF;
			for(j=0;j<i;j++)
			{
				if(num[j]<num[i]&&num[i]-num[j]>i-j-1)
				{
					if(dp[j]>M)
						M=dp[j];
				}
			}
			if(M!=-INF)
				dp[i]=M+1;
			else
				dp[i]=1;
		}
		int MAX=0;
		for(i=0;i<n;i++)
		{
			if(MAX<dp[i])
				MAX=dp[i];
		} 
		printf("Case #%d:\n",++cas);
		printf("%d\n",n-MAX);
	}
	return 0;
}

你可能感兴趣的:(1711: 上升序列 (动态规划))