본문 바로가기
알고리즘/DP

(미해결) buy lower 더블릿

by 시끄러인마 2019. 2. 23.

#include <stdio.h>

#include <algorithm>

#include <vector>


using namespace std;


int dp[5005] = { 0 };

int arr[5005] = { 0 };

vector<vector<int> > par(5005);

int sum = 0, tmp = 1,maxDp=0;


void findPar(int x,int tmp, int time) {

if (time == maxDp) {

sum += tmp;

return;

}

for (int i = 0; i < par[x].size(); i++)

findPar(par[x][i],tmp,time+1);

}


int main() {

int n;

scanf("%d", &n);


for (int i = 1; i <= n; i++) {

scanf("%d", &arr[i]);

}


dp[1] = 1;

for (int i = 2; i <= n; i++) {

int maxNum = 0;

for (int j = 1; j < i; j++) {

if (arr[j] > arr[i] && maxNum < dp[j]) {

maxNum = dp[j];

}

}

dp[i] = maxNum + 1;

for (int j = 1; j < i; j++) {

if (arr[j] > arr[i] && dp[j] == maxNum) {

par[i].push_back(j);

}

}

}

for (int i = 1; i <= n; i++) {

maxDp = max(maxDp, dp[i]);

}

for (int i = 1; i <= n; i++)

printf("%d ", dp[i]);

for (int i = n; i >=1; i--) {

printf("%d->", arr[i]);

for (int j = 0; j < par[i].size(); j++)

printf("%d ", arr[par[i][j]]);

printf("\n");

}


for (int i = 1; i <= n; i++) {

if (maxDp == dp[i]) {

findPar(i, 1, 1);

printf("a%d", arr[i]);

}

}

printf("%d %d", maxDp, sum);

}

'알고리즘 > DP' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.07.05
2193 이친수  (0) 2019.07.05
색종이 더블릿 (업시퀀스)  (0) 2019.02.21
블록쌓기 더블릿 (업시퀀스)  (0) 2019.02.21
줄 세우기 더블릿  (0) 2019.02.21