如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列爲迴文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列。
使用雙端隊列deque數據結構進行求解。雙端隊列deque數據結構支持高效地首尾兩端元素的插入和刪除。(提交運行時間小於1ms)
本題思路爲:判斷隊首和隊尾元素。若二者相等,則將這兩個元素都彈出隊列,將隊列規模縮小2個,再對該問題進行判斷;若二者不相等,則選擇其中較小的一個,將該元素和與其相鄰的元素都彈出隊列,再將其和插入隊列,從而將隊列規模縮小1個,再對該問題進行判斷。
#include
#include
using namespace std;
int main() {
int length;
deque datas;
int count = 0;
int temp;
int start;
int end;
int add;
while (cin >> length) {
count = 0;
datas.clear();
for (int i = 0; i<length; i++) {
cin >> temp;
datas.push_back(temp);
}
while (datas.size() > 1) {
start = datas.front();
end = datas.back();
if (start == end) {
//若相等,刪除隊首和隊末元素
datas.pop_back();
datas.pop_front();
}
else {
//不相等
add = 0;
count++;
if (start <= end) {
add += start;
datas.pop_front();
add += datas.front();
datas.pop_front();
datas.push_front(add);
}
else {
add += end;
datas.pop_back();
add += datas.back();
datas.pop_back();
datas.push_back(add);
}
}
}
cout << count << endl;
}
return 0;
}