SOLUTION INFO
C++ · main.cpp
- 작성자
- tony9402
- 공동 작성자
- 없음
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N; cin >> N;
vector<int> V(N), DP(N);
for(auto &i: V) cin >> i;
for(int i=0;i<N;i++) {
DP[i] = V[i];
for(int j=0;j<i;j++) {
if(V[i] > V[j]) {
DP[i] = max(DP[i], DP[j] + V[i]);
}
}
}
cout << *max_element(DP.begin(), DP.end());
return 0;
}
SOLUTION DESCRIPTION
풀이 설명
등록된 풀이 설명이 없습니다.
SOLUTION INFO
Java · Main.java
- 작성자
- tony9402
- 공동 작성자
- 없음
import java.util.*;
import java.io.*;
import java.lang.*;
public class Main{
public static void main(String[] args){
FastReader rd = new FastReader();
int N = rd.nextInt();
int[] DP = new int[N + 1];
int[] arr = new int[N + 1];
for(int i = 1; i <= N; ++i) {
arr[i] = rd.nextInt();
}
int ans = 0;
for(int i = 1; i <= N; ++i) {
for(int j = 1; j < i; ++j) {
if(arr[j] < arr[i]) {
DP[i] = Math.max(DP[i], DP[j]);
}
}
DP[i] += arr[i];
ans = Math.max(ans, DP[i]);
}
System.out.println(ans);
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
}
catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() { return Integer.parseInt(next()); }
long nextLong() { return Long.parseLong(next()); }
double nextDouble() { return Double.parseDouble(next()); }
String nextLine() {
String str = "";
try {
str = br.readLine();
}
catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}
SOLUTION DESCRIPTION
풀이 설명
DP[i]: i 번째 수가 증가하는 부분 수열의 맨 마지막일 때 부분 수열의 합 중 최대
DP[i]: max_{1≤j<i, arr[j]<arr[i]}(DP[j]) + arr[i]
답: max_{1≤i≤N}(DP[i])