UVA 10581 - Partitioning for fun and profit
1881 단어 partition
10581 - Partitioning for fun and profit
제목 링크
제목: m, n을 정하여 n개의 칸에 분배하고 m개의 숫자를 분배하여 각각 칸마다 최소한 1을 넣는다. 그리고 서열이 점차적으로 증가하면 k개의 사전 서열이 무엇인지 묻는다.
사고방식: 먼저 dp를 이용하여 표를 작성하고 dp[i][j][k]는 i의 개수를 표시하며 꼬리는 j이고 나머지 k의 상황을 합쳐서 하나의 기억화로 구한다. 그 다음에 이 수조를 바탕으로 왼쪽에서 오른쪽으로 열거할 때 그 숫자를 적당히 넣고 출력한다. 마지막 숫자는 단독으로 출력해야 한다.
코드:#include <cstdio>
#include <cstring>
typedef long long LL;
int t, M, n, vis[15][225][225];
LL k, dp[15][225][225];
LL DP(int now, int tail, int m) {
LL &ans = dp[now][tail][m];
if (vis[now][tail][m]) return ans;
vis[now][tail][m] = 1;
ans = 0;
if (now == n) return ans = 1;
if (now == n - 1) {
if (m >= tail)
return ans = DP(now + 1, m, 0);
return ans = 0;
}
for (int i = tail; i <= m - (n - now - 1); i++)
ans += DP(now + 1, i, m - i);
return ans;
}
void solve(LL k) {
int v = 1;
for (int i = 1; i < n; i++) {
for (int j = v; j <= M - (n - i); j++) {
if (k > dp[i][j][M - j]) k -= dp[i][j][M - j];
else {
M -= j;
v = j;
printf("%d
", j);
break;
}
}
}
printf("%d
", M);
}
int main() {
scanf("%d", &t);
while (t--) {
memset(vis, 0, sizeof(vis));
scanf("%d%d%lld", &M, &n, &k);
DP(0, 1, M);
solve(k);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux의 i-node, 파티션, 파일 시스템 및 마운트 복습
2차 저장 장치 내의 파일의 실제 데이터 위치.↑ 파일 자체의 정보가 있는 곳.
(즉, 여러 개의 파일 이름을 추가해도 모든 파일 이름이 가리키는 i-number는 같다)
디렉토리에는 파일 이름과 i-number에 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include <cstdio>
#include <cstring>
typedef long long LL;
int t, M, n, vis[15][225][225];
LL k, dp[15][225][225];
LL DP(int now, int tail, int m) {
LL &ans = dp[now][tail][m];
if (vis[now][tail][m]) return ans;
vis[now][tail][m] = 1;
ans = 0;
if (now == n) return ans = 1;
if (now == n - 1) {
if (m >= tail)
return ans = DP(now + 1, m, 0);
return ans = 0;
}
for (int i = tail; i <= m - (n - now - 1); i++)
ans += DP(now + 1, i, m - i);
return ans;
}
void solve(LL k) {
int v = 1;
for (int i = 1; i < n; i++) {
for (int j = v; j <= M - (n - i); j++) {
if (k > dp[i][j][M - j]) k -= dp[i][j][M - j];
else {
M -= j;
v = j;
printf("%d
", j);
break;
}
}
}
printf("%d
", M);
}
int main() {
scanf("%d", &t);
while (t--) {
memset(vis, 0, sizeof(vis));
scanf("%d%d%lld", &M, &n, &k);
DP(0, 1, M);
solve(k);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux의 i-node, 파티션, 파일 시스템 및 마운트 복습2차 저장 장치 내의 파일의 실제 데이터 위치.↑ 파일 자체의 정보가 있는 곳. (즉, 여러 개의 파일 이름을 추가해도 모든 파일 이름이 가리키는 i-number는 같다) 디렉토리에는 파일 이름과 i-number에 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.