Submission #71073918
Source Code Expand
Copy
#include <stdio.h>#define MOD_BY 1000000007int add(int a, int b) {return a + b - MOD_BY * (a + b >= MOD_BY);}int N;char s[4096];int memo[4096][4096];#if 0int calc(int pos, int available) {int unavailable = N - pos - available;int ans = 0;int i;if (pos >= N) return 1;if (memo[pos][available]) return ~memo[pos][available];for (i = 0; i < available; i++) {
#include <stdio.h>
#define MOD_BY 1000000007
int add(int a, int b) {
return a + b - MOD_BY * (a + b >= MOD_BY);
}
int N;
char s[4096];
int memo[4096][4096];
#if 0
int calc(int pos, int available) {
int unavailable = N - pos - available;
int ans = 0;
int i;
if (pos >= N) return 1;
if (memo[pos][available]) return ~memo[pos][available];
for (i = 0; i < available; i++) {
int next_available;
if ((pos == 0 ? '<' : s[pos - 1]) == s[pos]) {
/* 同じ方向 → 今の所より「上」のみを次に使える */
next_available = available - i - 1;
} else {
/* 違う方向 → 今の所より「下」のみを次に使える */
next_available = unavailable + i;
}
ans = add(ans, calc(pos + 1, next_available));
}
return ~(memo[pos][available] = ~ans);
}
int solve(void) {
return calc(0, N);
}
#else
int sub(int a, int b) {
return b == 0 ? a : add(a, MOD_BY - b);
}
int memo_sum[4096][4096];
int solve(void) {
int pos, available;
memo[N][0] = 1;
memo_sum[N][0] = 1;
for (pos = N - 1; pos >= 0; pos--) {
for (available = 0; available <= N - pos; available++) {
int start, end;
if ((pos == 0 ? '<' : s[pos - 1]) == s[pos]) {
start = 0; /* available - (available - 1) - 1 */
end = available - 1;
} else {
start = N - pos - available;
end = N - pos - 1; /* N - pos - available + (available - 1) */
}
if (start <= end) {
int ans = memo_sum[pos + 1][end];
if (start > 0) ans = sub(ans, memo_sum[pos + 1][start - 1]);
memo[pos][available] = ans;
}
memo_sum[pos][available] = add(available > 0 ? memo_sum[pos][available - 1] : 0, memo[pos][available]);
}
}
return memo[0][N];
}
#endif
int main(void) {
if (scanf("%d", &N) != 1) return 1;
if (scanf("%4095s", s) != 1) return 1;
printf("%d\n", solve());
return 0;
}
/*
ある整数を使う → そのあとはそれを除いた列で考えればいい (何を使ったかはあまり関係ない)
*/
Submission Info
| Submission Time | |
|---|---|
| Task | T - Permutation |
| User | mikecat |
| Language | C (gcc 12.2.0) |
| Score | 100 |
| Code Size | 2029 Byte |
| Status | AC |
| Exec Time | 42 ms |
| Memory | 49400 KiB |
Judge Result
| Set Name | All | ||
|---|---|---|---|
| Score / Max Score | 100 / 100 | ||
| Status |
|
| Set Name | Test Cases |
|---|---|
| All | 0_00, 0_01, 0_02, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13 |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 0_00 | AC | 1 ms | 1620 KiB |
| 0_01 | AC | 1 ms | 1744 KiB |
| 0_02 | AC | 1 ms | 1764 KiB |
| 1_00 | AC | 0 ms | 1624 KiB |
| 1_01 | AC | 1 ms | 1692 KiB |
| 1_02 | AC | 32 ms | 49304 KiB |
| 1_03 | AC | 31 ms | 49400 KiB |
| 1_04 | AC | 42 ms | 49288 KiB |
| 1_05 | AC | 42 ms | 49372 KiB |
| 1_06 | AC | 37 ms | 49396 KiB |
| 1_07 | AC | 36 ms | 48480 KiB |
| 1_08 | AC | 36 ms | 48356 KiB |
| 1_09 | AC | 37 ms | 48644 KiB |
| 1_10 | AC | 36 ms | 48008 KiB |
| 1_11 | AC | 36 ms | 48176 KiB |
| 1_12 | AC | 34 ms | 46636 KiB |
| 1_13 | AC | 37 ms | 49152 KiB |