[白俊]#2352半導体設計
質問する
半導体を設計する場合、n個のポートを他のn個のポートに接続する必要がある場合がある.
たとえば、左の図は、n個のポートと他のn個のポートを接続する方法を示しています.ただし、このように接続すると、接続線は互いに絡み合っているので、このように接続することはできません.n個のポートが他のn個のポートにどのように接続されるべきかを指定する場合は、ベースラインの交差(オーバーラップ)を回避しながら、最大何個のポートに接続できるかを決定するプログラムを作成します.
入力
第1行は整数n(1≦n≦40000)を与える.次の行では、1番ポートに順次接続するポート番号、2番ポートに接続するポート番号、…、n番ポートに接続するポート番号を示します.これらの数が1以上n以下であると仮定し,等しくならない.
しゅつりょく
最初の行に最大接続数を出力します.
入力例1
6
4 2 6 3 1 5
サンプル出力1
3
に答える
この問題はLIS(最長増分部分数列)アルゴリズムで解くことができる.動的プログラミングを用いてLISを実現した.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int dp[] = new int[N];
int res = 0;
String[] input = br.readLine().split(" ");
for(int i=0; i<N; i++)
arr[i] = Integer.parseInt(input[i]);
for(int i=1; i<N; i++) {
for(int j=i-1; j>=0; j--) {
if(arr[i] > arr[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
for(int i=0; i<N; i++)
res = Math.max(res, dp[i]);
System.out.println(res+1);
}
}
Reference
この問題について([白俊]#2352半導体設計), 我々は、より多くの情報をここで見つけました https://velog.io/@pss407/백준2352-반도체-설계テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol