同步
原題鏈結
簡要題意:
一開始你有乙個長度為 n
nn 的無色串,每次可以對乙個區間染上相同的顏色。問最少多少次可以形成目標串。
告訴你,這題的藍是假的,太假了,資料也太弱了。
完全是個暴力選手亂碾標算用的,其實本題的時間複雜度完全可以做到 o(n
3)
o(n^3)
o(n3).
第一眼看資料範圍還以為是大力爆搜剪枝
用 fi,j
f_fi
,j 表示 [i,
j]
[i,j]
[i,j
] 區間形成目標串中 [i,
j]
[i,j]
[i,j
] 的最少次數。
如果 si=
sj
s_i = s_j
si=sj
,說明我們可以有兩種情況:
反正這倆相等,那麼 fi,
j=fi
+1,j
f_ = f_
fi,j=
fi+1
,j.
不然呢就是 fi,
j=fi
,j−1
f_ = f_
fi,j=
fi,j
−1.
即:fi,j
=min(
fi+1
,j,f
i,j−
1)
f_ = \min(f_ , f_)
fi,j=
min(fi
+1,j
,fi
,j−1
)即從區間兩端往內減少 111.
如果不相等,我們需要列舉中間數 k
kk,即把區間一分兩段。
f i,
j=
min(f
i,k+
fk+1
,j)(
i≤
k
f_=\min(f_ + f_) (i \leq k < j)
fi,j=
min(fi
,k+
fk+1
,j)
(i≤k
當然為了滿足無後效性,我們需要先列舉長度(即按照區間長度進行計算,而不是按照左右端點)
此時我們興致勃勃的寫了乙個程式。
時間複雜度:o(n
2)
o(n^2)
o(n2).
實際得分:60pt
s60pts
60pts.
為什麼會 wa#pragma gcc optimize(2)
#include
using
namespace std;
inline
intread()
int x=0;
while
(ch>=
'0'&& ch<=
'9') x=
(x<<3)
+(x<<1)
+ch-
'0',ch=
getchar()
;return x*f;
}int n,f[
101]
[101];
string s;
intmain()
printf
("%d\n"
,f[1
][n]);
return0;
}
\text
wa 呢?你也許不太明白。
那你就別明白了,背**萬歲
本人發現,洛谷上置於樓頂的幾篇題解都是狀態轉移方程裡好好的 si=
sj
s_i = s_j
si=sj
,然後到**裡就是 si−
1=sj
−1
s_ = s_
si−1=
sj−1
,讓人難以明白。這裡特此說明!而且,如果有 si=
sj
s_i = s_j
si=sj
也大多是下標從 0
00 開始列舉的。
然後你測了一下樣例!
???你不明白自己的程式為什麼會輸出 2color 1.in
aaaaa
color 1.out
1color.out
2
22???
然後你開始除錯,輸出所有區間的值,得到乙個結果是:
為什麼所有以 51 1 1
1 2 1
1 3 1
1 4 1
1 5 2
2 2 1
2 3 1
2 4 1
2 5 2
3 3 1
3 4 1
3 5 2
4 4 1
4 5 2
5 5 1
55 結尾的區間(除了元區間 [5,
5]
[5,5]
[5,5
]) 都有了錯誤的答案?
這就是因為,字串下標從 0
00 開始!!!
你訪問 s
5s_5
s5 是乙個空字元!
真是乙個大坑啊
時間複雜度:o(n
3)
o(n^3)
o(n3).
實際得分:100pt
s100pts
100pts
.
#pragma gcc optimize(2)
#include
using
namespace std;
inline
intread()
int x=0;
while
(ch>=
'0'&& ch<=
'9') x=
(x<<3)
+(x<<1)
+ch-
'0',ch=
getchar()
;return x*f;
}int n,f[
101]
[101];
string s;
intmain()
printf
("%d\n"
,f[1
][n]);
return0;
}
洛谷P4170 CQOI2007 塗色
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...
P4170 CQOI2007 塗色 區間dp
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...
洛谷 P4170 CQOI2007 塗色
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...