测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A45691. 神奇的数列一个正整数数列, 可以将它切割成若干个数据段, 每个数据段由值相同的相邻元素构成。 该数列的神奇之处在于, 每次切除一个数据段后,该数据段前后的元素自动连接在一起成为邻居。 例如从数列“2 8 9 7 7 6 9 4” 中切除数据段“7 7 ” 后, 余下的元素会构成数列“2 8 9 6 9 4”请问若要将该数列切割成若干个数据段, 则至少会切出来几个数据段?样例: 按下列顺序切割数列…

填空题 较难

题目描述

神奇的数列

一个正整数数列, 可以将它切割成若干个数据段, 每个数据段由值相同的相邻元素构成。 该数列的神奇之处在于, 每次切除一个数据段后,该数据段前后的元素自动连接在一起成为邻居。 例如从数列“2 8 9 7 7 6 9 4” 中切除数据段“7 7 ” 后, 余下的元素会构成数列“2 8 9 6 9 4”请问若要将该数列切割成若干个数据段, 则至少会切出来几个数据段?

样例: 按下列顺序切割数列“2 8 9 7 7 6 9 4” , 只要切割成 6 段

切割出“7 7” , 余下 “2 8 9 6 9 4”

切割出 “6” , 余下 “2 8 9 9 4”

切割出 “9 9” , 余下 “2 8 4”

切割出 “2” , 余下 “8 4”

切割出 “8” , 余下 “4”

时间限制: 1000

内存限制: 65536

输入

第一行是一个整数, 示共有多少组测试数据。 每组测试数据的输入包括两行: 第一行是整数 N, N<=200,表示数列的长度, 第二行是 N 个正整数。

输出

每个测试案例的输出占一行, 是一个整数。 格式是: Case n: x n 是测试数据组编号, x 是答案

样例输入

2

8

2 8 9 7 7 6 9 4

16

2 8 9 7 7 6 9 4 4 2 8 4 2 7 6 9

样例输出

Case 1: 6

Case 2: 11

参考答案

#include <iostream> #include <cstring> using namespace std; int score[202][202]; int N; int num[202]; int main () { int T; //cin >> T; //freopen("C:\\Users\\csctest\\Desktop\\slin.txt", "r", stdin); //freopen("C:\\Users\\csctest\\Desktop\\sloutx.txt", "w", stdout); scanf("%d", &T); int T0 = T; while (T--) { /*for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { score[i][j] = 256; } }*/ memset(score, 1, sizeof(score)); memset(num, 0, sizeof(num)); int N; scanf("%d", &N); //cin >> N; for (int i = 0; i < N; ++i) { scanf("%d", &num[i]); //cin >> num[i]; score[i][i] = 1; } for (int i = 0; i < N; ++i) { for (int j = 0; j < i; ++j) { score[i][j] = 0; } } for (int i = 0; i < N-1; ++i) { if (num[i] == num[i+1]) score[i][i+1] = 1; else score[i][i+1] = 2; } for (int i = N - 2; i >= 0; --i) { for (int j = i + 1; j < N; ++j) { for (int k = i; k < j; ++k) { if (num[k] == num[j]) { score[i][j] = min(score[i][j], score[i][k] + score[k+1][j-1]); } score[i][j] = min(score[i][j], score[i][k] + score[k+1][j]); } } } /* for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (score[i][j] < 10000 ) printf("%d ", score[i][j]);//cout << score[i][j] << " "; else printf("%d ", -1); //cout << -1 << " "; } printf("\n");//cout << endl; }*/ printf("Case %d: %d\n", T0-T, score[0][N-1]); //cout << "Case " << T0-T << ": " <<score[0][N-1] << endl; } return 0; }
上一题 下一题