제출 #167674

#제출 시각아이디문제언어결과실행 시간메모리
167674shuvi_dolaVještica (COCI16_vjestica)C++14
160 / 160
155 ms1868 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 16) + 3;
const int inf = 1e9 + 8;
int dp[N], same[N];
string s[20];
int cnt[20][30];
int main() {
	int n;
	cin >> n;
	for(int i = 0; i < n; i++) {
		cin >> s[i];
		for(int j = 0; j < (int)s[i].length(); j++) {
			cnt[i][s[i][j] - 'a']++;
		}
	}

	for(int mask = 0; mask < (1 << n); mask++) {
		for(int i = 0; i < 26; i++) {
			int mnsame = inf;
			for(int j = 0; j < n; j++) {
				if((mask & (1 << j))) {
					mnsame = min(mnsame, cnt[j][i]);
				}
			}
			same[mask] += mnsame;
		}
	}
	dp[0] = inf;
	for(int mask = 0; mask < (1 << n); mask++) {
		if(__builtin_popcount(mask) == 1) {
			for(int i = 0; i < n; i++) {
				if((mask & (1 << i))) {
					dp[mask] = s[i].length();
				}
			}
		}
		else {
			dp[mask] = inf;
			for(int submask = mask; submask > 0; submask = (submask - 1) & mask) {
				dp[mask] = min(dp[mask], dp[submask] + dp[submask ^ mask] - same[mask]);
			}
		}
	}
	cout << dp[(1 << n) - 1] + 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...