1. 程式人生 > >[TJOI2007]調整隊形

[TJOI2007]調整隊形

例如 輸入輸出格式 sin 直接 希望 想要 reg esp 衣服

題目背景

學校藝術節上,規定合唱隊要參加比賽,各個隊員的衣服顏色不能很混亂:合唱隊員應排成一橫排,且衣服顏色必須是左右對稱的。

例如:“紅藍綠藍紅”或“紅藍綠綠藍紅”都是符合的,而“紅藍綠紅”或“藍綠藍紅”就不符合要求。

合唱隊人數自然很多,僅現有的同學就可能會有3000個。老師希望將合唱隊調整得符合要求,但想要調整盡量少,減少麻煩。以下任一動作認為是一次調整:

題目描述

1、在隊伍左或右邊加一個人(衣服顏色依要求而定);

2、在隊伍中任兩個人中間插入一個人(衣服顏色依要求而定);

3、剔掉一個人;

4、讓一個人換衣服顏色;

老師想知道就目前的隊形最少的調整次數是多少,請你編一個程序來回答他。

因為加入合唱隊很熱門,你可以認為人數是無限的,即隨時想加一個人都能找到人。同時衣服顏色也是任意的。

輸入輸出格式

輸入格式:

第一行是一個整數n(1<=n<=3000)。

第二行是n個整數,從左到右分別表示現有的每個隊員衣服的顏色號,都是1到3000的整數。

輸出格式:

一個數,即對於輸入隊列,要調整得符合要求,最少的調整次數。

輸入輸出樣例

輸入樣例#1:
5
1 2 2 4 3
輸出樣例#1:
2
廢話少說,這種水題直接上代碼
#include<bits/stdc++.h>
using
namespace std; int n,a[3001],f[3001][3001]; int main(){ int i,l,j; cin>>n; for(i=1;i<=n;i++)scanf("%d",&a[i]); for(l=2;l<=n;l++){ for(i=1;i+l-1<=n;i++){ j=i+l-1; if(a[i]==a[j])f[i][j]=f[i+1][j-1]; else f[i][j]=min(f[i+1
][j],min(f[i][j-1],min(f[i+1][j],f[i+1][j-1])))+1; } } cout<<f[1][n]<<endl; return 0; }

 

[TJOI2007]調整隊形