๋ฌธ์
(์ฃผ์: ์ด ๋ฌธ์ ๋ TopCoder ์ ๋ฒ์ญ ๋ฌธ์ ์ ๋๋ค.)
๊ฐ๋ TV ์ ๋ณด๋ฉด ์์ฃผ์จ์ ๋ช๋ง ์๋ฆฌ๊น์ง ์ค์ค ์ธ์ฐ๋ ์ ๋๋ค์ด ๋ฑ์ฅํ๊ณค ํฉ๋๋ค. ์ด๋ค์ด ์ด ์๋ฅผ ์ธ์ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ์ซ์๋ฅผ ๋ช ์๋ฆฌ ์ด์ ๋์ด ์ธ์ฐ๋ ๊ฒ์ด ์์ต๋๋ค. ์ด๋ค์ ์ซ์๋ฅผ ์ธ ์๋ฆฌ์์ ๋ค์ฏ ์๋ฆฌ๊น์ง๋ก ๋์ด์ ์ธ์ฐ๋๋ฐ, ๊ฐ๋ฅํ๋ฉด 55555 ๋ 123 ๊ฐ์ด ์ธ์ฐ๊ธฐ ์ฌ์ด ์กฐ๊ฐ๋ค์ด ๋ง์ด ๋ฑ์ฅํ๋ ๋ฐฉ๋ฒ์ ํํ๊ณค ํฉ๋๋ค.
์ด ๋, ๊ฐ ์กฐ๊ฐ๋ค์ ๋์ด๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ํด์ง๋๋ค:
๋ชจ๋ ์ซ์๊ฐ ๊ฐ์ ๋ (์: 333, 5555) ๋์ด๋: 1
์ซ์๊ฐ 1์ฉ ๋จ์กฐ ์ฆ๊ฐํ๊ฑฐ๋ ๋จ์กฐ ๊ฐ์ํ ๋ (์: 23456, 3210) ๋์ด๋: 2
๋ ๊ฐ์ ์ซ์๊ฐ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์ถํํ ๋ (์: 323, 54545) ๋์ด๋: 4
์ซ์๊ฐ ๋ฑ์ฐจ ์์ด์ ์ด๋ฃฐ ๋ (์: 147, 8642) ๋์ด๋: 5
๊ทธ ์ธ์ ๊ฒฝ์ฐ ๋์ด๋: 10
์์ฃผ์จ์ ์ผ๋ถ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋, ๋์ด๋์ ํฉ์ ์ต์ํํ๋๋ก ์ซ์๋ค์ 3์๋ฆฌ์์ 5์๋ฆฌ๊น์ง ๋์ด ์ฝ๊ณ ์ถ์ต๋๋ค. ์ต์์ ๋์ด๋๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C (<= 50) ๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ 8๊ธ์ ์ด์ 10000๊ธ์ ์ดํ์ ์ซ์๋ก ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ํ ์ค์ ์ต์์ ๋์ด๋๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
L๊ธ์ ์ ์ธ ๋๋จธ์ง ์์ด์ ๋ํ ๋์ด๋ + ๊ธธ์ด L์ธ ์กฐ๊ฐ์ ๋์ด๋ (L์ 3-5)
๋ฉ๋ชจ์ด์ ์ด์
1) L๊ธ์ ์ ์ธ ๋๋จธ์ง ์์ด์ ๋ํ ๋์ด๋ + ๊ธธ์ด L์ธ ์กฐ๊ฐ์ ๋์ด๋ (L์ 3-5)
ret = Math.min(ret, memorize(begin+L) + classify(begin, begin+L-1));
2) ๋ฉ๋ชจ์ด์ ์ด์
int ret = cache[begin];
if(ret != -1) return ret;
...
return ret;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class DP_EX_6 {
static String N;
static int cache[];
static int max = 12345678;
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int tc = Integer.parseInt(br.readLine().trim());
while(tc > 0) {
N = br.readLine().trim();
cache = new int[N.length()];
Arrays.fill(cache, -1);
bw.flush();
bw.write(memorize(0)+"\n");
tc--;
}
bw.close();
}
static int classify(int a, int b) {
String M = N.substring(a, b+1);
String s = "";
for(int i=0; i<M.length(); i++)
s += M.charAt(0);
if(M.equals(s)) return 1;
boolean progressive = true;
for(int i=1; i<M.length(); i++) {
if(M.charAt(i)-M.charAt(i-1) != M.charAt(1)-M.charAt(0)) {
progressive = false;
break;
}
}
if(progressive && Math.abs(M.charAt(1)-(int)M.charAt(0)) == 1)
return 2;
boolean alternative = true;
for(int i=0; i<M.length(); i++) {
if(M.charAt(i) != M.charAt(i%2)) {
alternative = false;
break;
}
}
if(alternative) return 4;
if(progressive) return 5;
return 10;
}
static int memorize(int begin) {
if(begin == N.length()) return 0;
int ret = cache[begin];
if(ret != -1) return ret;
ret = max;
for(int L=3; L<=5; L++) {
if(begin+L <= N.length())
ret = Math.min(ret, memorize(begin+L) + classify(begin, begin+L-1));
}
return ret;
}
}
์๊ฐ์ด๊ณผ ๋ฌ๋๋ฐ ํ ์คํธ ์ผ์ด์ค ์ ๋์๊ฐ๋ ๊ฑธ๋ก ๋ด์๋ ์ ์ง ๊ฑฐ ๊ฐ๋ค..