Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
就是一道状压的水题,转移注意细节就好,比如没有包含情况。#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int INF = 0x3f3f3f3f; #define B(x) (1<<(x)) char str[11][25]; int dp[B(10) + 5][11]; int nxt[25], add[11][11], n; void get_next(char T[], int len){ int i = 0, j = -1; nxt[i] = -1; while(i < len){ if(j == -1 || T[i] == T[j]){ i++; j++; nxt[i] = j; }else j = nxt[j]; } } int kmp(char S[], char T[], int lenS, int lenT){ int i = 0, j = 0; while(i < lenS){ if(j == -1 || S[i] == T[j]){ i++; j++; }else j = nxt[j]; } return j; } void Init(){ int len1, len2; for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ len1 = strlen(str[i]); len2 = strlen(str[j]); get_next(str[j], len2); add[i][j] = len2 - kmp(str[i], str[j], len1, len2); get_next(str[i], len1); add[j][i] = len1 - kmp(str[j], str[i], len2, len1); } } } int main(){ //freopen("read.txt", "r", stdin); int T; scanf("%d", &T); while(T--){ scanf("%d", &n); for(int i = 0; i < n; i++){ scanf("%s", str[i]); } Init(); memset(dp, 0x3f, sizeof dp); int full = B(n) - 1; for(int i = 0; i < n; i++){ dp[B(i)][i] = strlen(str[i]); } for(int s = 0; s <= full; s++){ for(int i = 0; i < n; i++){ if(dp[s][i] == INF) continue; for(int j = 0; j < n; j++){ if((s & B(j))) continue; dp[s | B(j)][j] = min(dp[s | B(j)][j], dp[s][i] + add[i][j]); } } } int ans = INF; for(int i = 0; i < n; i++){ ans = min(ans, dp[full][i]); } printf("%d\n", ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator