uva 10581 - Partitioning for fun and profit(기억화 검색 + 수론)
제목 대의: m, n, k를 정하고 m를 n부로 분해한 후 매 부의 개수에 따라 사전 서열을 정하고 구분할 때ai-1≤ai를 요구하며 사전 서열을 k위에 배열하는 구분 방법을 출력한다.
문제풀이 사고방식:ai-3-1≤ai의 조건이 있기 때문에 먼저 기억화 검색을 통해 조합 상황 dp[i][j][s]가 i위가 j임을 표시하고 나머지 미획분수가 s인 총수는 dp[i][j][s]를 처리한 다음에 각 위의 값을 매거하여 서열의 위치를 판단하면 된다.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 220;
const int maxp = 10;
int M, N;
ll K, dp[maxp+5][maxn+5][maxn+5];
ll dfs (int d, int x, int s) {
if (d == N) {
if (0 == s)
return 1;
else
return 0;
}
ll& ans = dp[d][x][s];
if (ans != -1)
return ans;
ans = 0;
for (int i = x; ; i++) {
if ((N-d) * i > s)
break;
ans += dfs(d+1, i, s-i);
}
return ans;
}
void solve () {
int s = M, t = 1;
for (int i = 1; i < N; i++) {
for (int j = t; ; j++) {
ll u = dp[i][j][s-j];
if (K > u) {
K -= u;
} else {
printf("%d
", j);
s -= j;
t = j;
break;
}
}
}
printf("%d
", s);
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d%lld", &M, &N, &K);
memset(dp, -1, sizeof(dp));
for (int i = 1; i * N <= M; i++)
ll u = dfs(1, i, M-i);
solve();
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.