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

来源:互联网 发布:js去除数组的重复元素 编辑:程序博客网 时间:2024/06/05 13:46

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:ausing 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;elsedp[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;}

0 0
原创粉丝点击