1711: 上升序列
时间限制: 1 Sec 内存限制: 128 MB提交: 33 解决: 6
[ 提交][ 状态][ 讨论版]
题目描述
我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增(严格递增即相邻元素不存在相等的情况)。其中无论是修改前还是修改后,每个元素都必须是整数。 请输出最少需要修改多少个元素。
输入
第一行输入一个T(1≤T≤10),表示有多少组数据
每一组数据:
第一行输入一个N(1<N<100000)表示数列的长度
第二行输入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;
}