您的位置:首页 > 其它

CSU 1729: 齿轮传动

2016-07-27 12:46 357 查看
题目:

Description

你在一家机械厂打工,你的老板让你把一组齿轮种类序列a1,a2,..,an取走几个让齿轮的传动比
为1:1,老板要求你取走最少的齿轮,不能改变齿轮原来的相对位置,满足条件,即齿轮种类组合起
来是回文串。

Input

多组数据,第一行有一个整数T , 表示有T组数据。(T<=100)以下每组数据第一行有一个整数n , 表示n个齿轮(1<=n<=1000)接下来一行有n个整数a1,a2,…,an表示齿轮种类 (1<=ai<=10000)

Output

取走的最少齿轮数

Sample Input

1
4
1 2 3 1

Sample Output

1
这个题目,传动比为1:1是什么意思,其实我不太理解。
不过无所谓,反正就是去掉一些数字,剩下的构成回文串。
我是用动态规划做的,时间比较长,696ms
代码:
#include<iostream>;
using namespace std;

int main()
{
int t;
cin >> t;
int n;
while (t--)
{
cin >> n;
int *a = new int[n];
for (int i = 0; i < n; i++)cin >> a[i];

int **list = new int *[n];
for (int i = 0; i < n; i++)list[i] = new int[n];
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)list[i][j] = 0;
for (int i = 0; i < n; i++)list[i][i] = 1;

for (int i = n-1; i >=0 ; i--)
{
for (int j = i + 1; j < n; j++)
{
list[i][j] = list[i + 1][j];
if (list[i][j - 1]>list[i][j])list[i][j] = list[i][j - 1];
if (list[i + 1][j - 1] + 2>list[i][j] && a[i] == a[j])list[i][j] = list[i + 1][j - 1] + 2;
}
}
cout << n - list[0][n - 1]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: