[TJOI2007]調整隊形
阿新 • • 發佈:2019-05-14
例如 輸入輸出格式 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> usingnamespace 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]調整隊形