帮我把下列代码转换为c++:import java.io.*; import java.util.TreeMap; public class Main{ public static void main(String[] args)throws IOException{ BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(read.readLine()); String[] str = read.readLine().split(" "); int dp[] = new int[n];//以array[i]结尾的序列的最长长度 int array[] = new int[n]; for(int i=0;i<n;i++){ array[i] = Integer.parseInt(str[i]); dp[i] = 0; } int max = 0;//最长子序列长度 int flag = 0;//当前最长序列 TreeMap<Integer,Integer> map = new TreeMap<Integer,Integer>();//(长度为i的最小结尾数, 序列长度i) for(int i=0;i<n;i++){ Integer key = map.ceilingKey(array[i]); if(key == null){//没找到ceiling,说明当前array是最大的,添加一个键值对,序列长度加1 map.put(array[i],++flag); dp[i] = flag; }else{//找了,更新,(键1,值1)替换成(键2,值1) dp[i] = map.get(key); map.remove(key); map.put(array[i],dp[i]); } max = Math.max(max, dp[i]); } //System.out.println(max); String sout = ""; for(int j = n-1;j>=0;j--){//倒序遍历,遇到len,len-1,len-1...将其加入字符串 if(dp[j] == max){ sout = array[j]+" "+sout ; max--; } } System.out.print(sout); } }
时间: 2023-06-04 12:05:58 浏览: 89
java代码-import java.util.Scanner;
5星 · 资源好评率100%
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 100005
int array[MAXN],dp[MAXN],n;//以array[i]结尾的序列的最长长度
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&array[i]);
dp[i] = 0;
}
int max = 0;//最长子序列长度
int flag = 0;//当前最长序列
for(int i=0;i<n;i++){
int j=0,k=max;//二分查找
while(j<k){
int mid = (j+k)>>1;
if(dp[mid]<array[i]){
j = mid+1;
}else{
k = mid;
}
}
dp[j] = array[i];
if(j == max){
max++;
flag++;//标记序列长度
}
}
printf("%d\n",flag);
return 0;
}
阅读全文