[12년 특기생 두 번째 문제] [DP] K 상승단.

6236 단어 DPssl

K 상승단. K 상승단. K 상승단.


제목.


자연수 1... n의 배열 A[1... N]는 몇 개의 단조로운 증가 서열로 나눌 수 있다.각 단조로운 증가 시퀀스는 연속 요소 A[st...ed]로 구성되며 다음 조건을 충족합니다. 1 < = s t, e d < = n;1<=st,ed<=n; 1<=st,ed<=n; A [ i ] < A [ i + 1 ] ( s t < = i < = e d − 1 ) A[i] A[i]<A[i+1](st<=i<=ed−1) e d = n 또는 A [e d] > A [e d + 1] ed=n 또는 A [ed] > A [ed+1] ed=n 또는 A [ed] > A [ed+1] 예: 배열 1 2 4 5 6 3 9 10 7 8 3개의 단조로운 증가 서열 1 2 3 4 5 6으로 나눌 수 있다.3 9 10 ;7 8 ; 그래서 우리는 이것이 3상승단 서열이라고 부른다.현재 n과 k를 정하고 n의 전체 배열 중의 k 상승 단계 서열의 개수를 구합니다.

입력


입력은 n, k (1 < n < 20, 1 < k < n) 수를 포함하는 행만 1행으로 구성됩니다.

출력


n의 모든 k 상승 단계의 개수를 출력합니다.

샘플 가져오기

K.IN
3 2

출력 예제

K.OUT
4

설명


(설명, 적합 배열은 13231213231)

문제풀이의 방향


이 문제는 DP DP DP로 f[i, j] f[i, j] f[i, j] f[i, j]를 1i1~i 1i분에서 jj 세그먼트에 맞는 정렬 개수 F[i] [j] = (i-j+1) f [i-1] [j-1] + j-f [i-1] [j]를 설정합니다.( i < = n , j < n ) F[i][j]=(i-j+1)*f[i-1][j-1]+j*f[i-1][j];(i<=n,jF[i][j]=(i−j+1)∗f[i−1][j−1]+j∗f[i−1][j];(i<=n,j그 중에서 i는 i의 전체 배열을 나타내고 j는 구분된 단수를 나타낸다

절차는 다음과 같다.

#include
#include
#include 
#include

using namespace std;

int n,k;

long long f[2001][2001];

int main()
{
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= n; ++i)
	for(int j = 1; j <= k; ++j)
	if(i == j) f[i][j] = 1;
	else f[i][j] = j * f[i - 1][j] + (i - j + 1) * f[i - 1][j - 1];
	printf("%lld", f[n][k]);
	return 0;
}

좋은 웹페이지 즐겨찾기