由於沒有好好聽課,小z的筆記全都記的雜亂無章,出現了好多錯誤的地方。小z的筆記是如此的糟糕,以至於他只記了一句例句,而且自己還不知道是什麼意思……然後在老師講語法的時候,小z又零星的記了幾個字母對,老師說,這幾個字母對是絕對不能相鄰的,而且相鄰是不關心字母的順序的,比如老師說,「ab」不能相鄰,那麼相同的,「ba」也不能相鄰。
現在小z到家了,開啟了上課的筆記,然後他發現筆記有很多自相矛盾的地方:為什麼下面的不能相鄰的字母對會出現在上面的例句裡面呢?糾結再三,小z覺得下面的東西相對比較簡單,所以記錯的概率比較小……他決定在上面的例句裡面擦掉幾個字母,使得句子變得合法。
但是小z還有其他作業要做呢,來不及整理筆記了,就把這個艱鉅的任務留給了大家,請問大家,小z最少要擦掉幾個字母,才能使得上面的例句合法?
dp設f[i]表示前i個最少擦除個數,則有
所以f的轉移方程就是
一道很好的根據公式進行優化的題,同時還精簡了轉移的決策,做到加速。
#include#include#includeusing namespace std;
const int maxn=100010;
int n,m;
char s[maxn];
bool v[30][30];
int f[maxn],g[maxn];
int main()
for(int i=1;i<=n;i++)
g[c]=min(g[c],f[i]-i);
}printf("%d\n",f[n]);
return 0;
}
洛谷 2187 小Z的筆記
題解 dp.設f i 表示前i個字母,保留第i個字母,最多可以保留多少個字母 設g i 為當前字母為i的位置對應的f的最大值。轉移方程就是f i max f i g j 1 j與s i 不衝突 g s i max g s i f i 1 include2 include3 include4 defi...
小Z的 AK 計畫 洛谷p2147
題目描述 在小z的家鄉,有機房一條街,街上有很多機房。每個機房裡都有一萬個人在切題。小z剛刷完codechef,準備出來逛逛。機房一條街有 n 個機房,第 i 個機房的座標為 xi 小z的家座標為 0。小z在街上移動的速度為1,即從 x1 到 x2 所耗費的時間為 x1 x2 每個機房的學生數量不同...
洛谷P2107 小Z的AK計畫
題目大意 有 n 個物品,第 i 個物品在 p i 大小為 w i 你在 0 要求移動距離加上大小總和小於 m 問你最多可以拿多少物品 題解 貪心,按距離排序,每次遇到乙個物品就把大小加入乙個大根堆,若堆中元素大小和加上距離大於 m 就把最大值刪去,直到符合 卡點 無 c code include ...