2020-09-06
초급 : 15786 Send me the money (Bronze II)
from sys import stdin
input = stdin.readline
N, M = map(int, input().split())
S = input()
for _ in range(M):
s = S
q = input()
while len(s)>0:
p = q.find(s[0])
if p==-1:
break
s = s[1:]
q = q[p+1:]
print(["false","true"][len(s)==0])
S가 포스트잇에 적힌 문자열의 부분 문자열인지 묻는 문제이다.
S에 적힌 순서대로 왼쪽부터 탐색하면 된다.
중급 : 14620 꽃길 (Silver II)
#include <bits/stdc++.h>
using namespace std;
int N, res = 2147483647;
int board[10][10];
bool visit[10][10];
int getCost(int r, int c) {
return board[r][c] + board[r - 1][c] + board[r][c - 1] + board[r + 1][c] + board[r][c + 1];
}
void setVisit(int r, int c, bool tf) {
visit[r][c] = visit[r - 1][c] = visit[r][c - 1] = visit[r + 1][c] = visit[r][c + 1] = tf;
}
bool getVisit(int r, int c) {
return visit[r][c] || visit[r - 1][c] || visit[r][c - 1] || visit[r + 1][c] || visit[r][c + 1];
}
void dfs(int flower, int cost, int row, int col) {
if (flower == 3) {
res = min(res, cost);
return;
}
for (int r = 1; r < N - 1; ++r) {
for (int c = 1; c < N - 1; ++c) {
if (r < row || (r == row && c < col)) continue;
if (getVisit(r, c)) continue;
setVisit(r, c, true);
dfs(flower + 1, cost + getCost(r, c), r, c);
setVisit(r, c, false);
}
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N;
for (int r = 0; r < N; ++r) {
for (int c = 0; c < N; ++c) {
cin >> board[r][c];
}
}
for (int r = 1; r < N - 1; ++r) {
for (int c = 1; c < N - 1; ++c) {
setVisit(r, c, true);
dfs(1, getCost(r, c), r, c);
setVisit(r, c, false);
}
}
cout << res;
return 0;
}
열심히 백트래킹하면 된다.
꽃잎의 모양이 특이하므로 비용, visit에 관한 함수를 만들어두면 좋다.
고급 : 17268 미팅의 저주 (Gold III)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll dp[5001];
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n; n /= 2;
dp[0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
dp[i] += dp[j] * dp[i - 1 - j];
dp[i] %= 987654321;
}
}
cout << dp[n];
return 0;
}
이 수열을 카탈란 수 라고 한단다.
댓글