動歸 rainbow與freda染旗

2021-06-10 07:12:09 字數 2105 閱讀 1630

rainbow與freda染旗

fromthis_poet

背景 background

freda:aya rainbow,怎麼沒看見你城堡掛旗子呀?

rainbow:我城堡旗子太難看了腫麼辦t_t

freda:lala~那好辦,我可以幫你染色呀~

rainbow:嗯嗯,那就試試吧~ 

描述 description

rainbow城堡的旗子是乙個有n個基本單位的長條》_<,每個單位都會被染成前m個大寫字母當中的乙個顏色。可是,rainbow認為,兩個相鄰的單位有相同的顏色很難看的說。所以,rainbow需要改動一些單位的顏色,使得不存在兩個相鄰的單位顏色相同。當然了,那些被改動的單位改動之後的顏色也是前m個大寫字母當中的乙個。rainbow想請你幫忙計算,它最少要改動多少個單位的顏色才能讓旗子好看呢?

輸入格式 inputformat

第一行兩個整數n、m,表示旗子組成的基本單位數目和顏色的範圍。

接下來一行乙個長度為n的字串,字串的每個字元都是在前m個大寫字母的範圍內的,表示rainbow的旗幟。

輸出格式 outputformat

一行乙個整數表示rainbow最少改動的單位數目。

樣例輸入 sampleinput

[複製資料]

樣例輸出 sampleoutput

[複製資料]

資料範圍和注釋 hint

樣例解釋:一種改動方法是abcaca。當然,還可能有別的改動方法。

對於30%的資料,n<=20.

對於100%的資料,n<=10^5,1<=m<=26.

時間限制 timelimitation

每個測試點1s

第一次自己做出來一道dp題,雖然很簡單。。。雖然還可以用貪心寫。。。。。

暴力dp f[i,j]表示 1..i面旗子,第i面旗子染成顏色j的最小染色方案。

顯然第i面旗子的方案由第i-1面旗子的方案轉移而來

對於第i面旗子有兩種決策,不染色,或染成顏色j。

1:第i-1面旗子染成顏色 j1 且 j1<>a[i]

f[i,a[i]]:=min(f[i,a[i]],f[i-1,j1])

2: 第i-1面旗子染成j1色,第i面旗子染成j色,且(j<>j1)( j<>a[i])

f[i,j]:=min(f[i,j],f[i-1,j1])+1

最後輸出f[n,i]裡面最小的值 1<=i<=m

var n,m,i,j,j1,ans:longint;

a:array[1..100000]of longint;

f:array[0..100000,1..26]of longint;

x:char;

function min(a,b:longint):longint;

begin

if a>b then exit(b) else exit(a);

end;

begin

readln(n,m);

for i:=1 to n do

begin

read(x);

a[i]:=ord(x)-64;

end;

fillchar(f,sizeof(f),$7f);

for i:=1 to m do f[0,i]:=0;

f[1,a[1]]:=0;

for i:=1 to n do

begin

for j1:=1 to m do //i-1

begin

if j1<>a[i] then f[i,a[i]]:=min(f[i,a[i]],f[i-1,j1]);

for j:=1 to m do if j<>a[i] then //change

if j<>j1 then f[i,j]:=min(f[i,j],f[i-1,j1]+1)

end;

end;

ans:=maxlongint;

for i:=1 to m do ans:=min(ans,f[n,i]);

writeln(ans);

readln;readln;

end.

整數劃分(動歸)

將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數量mod 10 9 7。sample input6sample output4 include incl...

動歸 編輯距離

設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。輸出格式 只有乙個正整數,為最少字元操作次數。輸...

動歸 道路遊戲

題目描述 小新正在玩乙個簡單的電腦遊戲。遊戲中有一條環形馬路,馬路上有n 個機械人工廠,兩個相鄰機械人工廠之間由一小段馬路連線。小新以某個機械人工廠為起點,按順時針順序依次將這n 個機械人工廠編號為1 n,因為馬路是環形的,所以第n 個機械人工廠和第1 個機械人工廠是由一段馬路連線在一起的。小新將連...