題意:給定乙個只由組成的字串s,長度為n, 故包含n+1個空隙;現要求在某個空隙插入乙個來自的字元,然後按照以下「消除規則」對插入後的字串進行消除操作,問最多能消掉幾個字元(包含插入的乙個)。
消除規則:
1. 自左至右掃瞄當前字串,若字元v從某個位置開始連續出現了2次及以上,則此區間內的v全部消除;
2. 重複步驟1直至不再有可消除的字元。
思路:模擬,列舉。
這個題有點像之前資料結構程式設計作業的「祖瑪」一題,同樣是會產生連鎖反應的「消除規則」,不過那道題是給定乙個方案,包含一連串的插入操作,直接用動態鍊錶模擬就好。而這道題要求最佳方案,所以可以列舉所有可能的插入方案,對每個方案都要模擬出消除後的結果。動態申請記憶體顯然不合適,而節點數又固定為n+1,所以我用靜態鍊錶來實現。
有兩個值得注意的地方:
1. 之前以為可以這樣剪枝:在挑選每個位置插入的字元時,只考慮和相鄰字元相同的。然而一直wa。。。感謝這篇題解給出的反例 bbbab
2. 關於複雜度分析:開始時不敢列舉,總感覺是指數的複雜度,但聽了kirai同學的聚合分析後明白了。簡述如下:
(1)首先有n+1個空隙,每個空隙有3種選擇,故共有3*(n+1)種插入方案;
(2)其次對於每個插入方案,要經歷若干趟掃瞄,而停止掃瞄的標誌為上一趟掃瞄是否發生過消除;
具體地,設第 i 趟掃瞄前字串長度為 m ,由於一趟掃瞄過程中指標不回溯,所以一趟掃瞄花費的時間為線性的,記為t[i] = t(m)。若此趟發生了消除,則字串的長度必然至少減1,故t[i+1] <= t(m-1)。而初始字串長度為n+1,故至多經過n趟掃瞄後,必然達到最終狀態。
至此觀察所有趟掃瞄的時間花費序列t,從t[n]到t[1],呈算術級數,故求和後與末項平方同階,為t(n2)。
(3)總的時間複雜度為o(n2 * 3 * (n+1)) = o(n3)
關於**:debug的時間太長了,需要多寫些模擬題
1 #include 2 #include 3 #includeview code4 #include 5 #include 6
#define rep(n) for(int i=0; i
7#define repe(n) for(int i=1; i<=(n); i++)
8#define clear(a, x) memset(a, x, sizeof(a))
9#define fread(fn) freopen((fn), "r", stdin)
10#define pb(a) push_back(a)
11#define sint(x) scanf("%d", &(x))
12using
namespace
std;
13const
int max_c = 105;14
15struct
node
16nodes[max_c];//
靜態鍊錶
20int n;//
節點個數
21int
head;
2223
intt;
24char
s[max_c];
25int
ans;
2627
void reset()
34 nodes[n].next = -1;//
末元的後繼35}
3637
intmain()
3860
//printf("\n");
61while(updated)
77if(discovered)else
86//
printf("delete one cluster\n");
87//
for(int j = nodes[head].next; j != -1; j = nodes[j].next)
90//
printf("\n");91}
92//
93//
for(int j = nodes[head].next; j != -1; j = nodes[j].next)
96//
printf("\n");97}
98 nodes[i].next = nodes[n+1].next;//
刪除插入的[n+1]
99 ans =max(ans, cnt);
100//
printf("ans this %d\n", cnt);
101reset();
102}
103}
104 printf("
%d\n
", ans);
105}
106return0;
107 }
hihocoder 1039 字元消除
小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 cc ccc 和 aa 會被同時消除,餘下 ab 和 b 拼成新的字串 a...
Hihocoder 1039 字元消除
小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 cc ccc 和 aa 會被同時消除,餘下 ab 和 b 拼成新的字串 a...
hihocoder 1039 字元消除
時間限制 1000ms 單點時限 1000ms 記憶體限制 256mb 小hi最近在玩乙個字元消除遊戲。給定乙個只包含大寫字母 abc 的字串s,消除過程是如下進行的 1 如果s包含長度超過1的由相同字母組成的子串,那麼這些子串會被同時消除,餘下的子串拼成新的字串。例如 abccbcccaa 中 c...