洛谷 4158 SCOI2009 粉刷匠

2021-10-02 09:00:16 字數 1539 閱讀 7120

題目描述

windy有 n 條木板需要被粉刷。 每條木板被分為 m 個格仔。 每個格仔要被刷成紅色或藍色。

windy每次粉刷,只能選擇一條木板上一段連續的格仔,然後塗上一種顏色。 每個格仔最多只能被粉刷一次。

如果windy只能粉刷 t 次,他最多能正確粉刷多少格仔?

乙個格仔如果未被粉刷或者被粉刷錯顏色,就算錯誤粉刷。

輸入格式

第一行包含三個整數,n m t。

接下來有n行,每行乙個長度為m的字串,'0』表示紅色,'1』表示藍色。

輸出格式

包含乙個整數,最多能正確粉刷的格仔數。

輸入輸出樣例

輸入 #1複製

3 6 3

111111

000000

001100

輸出 #1複製

16

說明/提示

30%的資料,滿足 1 <= n,m <= 10 ; 0 <= t <= 100 。

100%的資料,滿足 1 <= n,m <= 50 ; 0 <= t <= 2500 。

解釋:兩次dp,首先處理出每行,dp[

i][j

][0/

1]

:dp[i][j][0/1]:

dp[i][

j][0

/1]:

從1-i,塗j種顏色,且最後一種為0/1的最多正確格仔,轉移的話…

最後我們再$ret[i][j]:$1-i行,用了j次最小多少,最後我們可以統計答案

#include#include#include#define min(x,y) x>y?y:x

#define inf 1000000009

using namespace std;

long long n=0,m=0,t=0;

char g[103];

long long a[53][53]=;

long long dp[53][2503][2]=;

long long ret[53][2503]=;

int main()else

}elseelse}}

}}

for(int j=1;j<=t;j++)

a[ii][0]=m;

}for(int i=1;i<=n;i++) for(int j=0;j<=t;j++) ret[i][j]=inf;

long long ans=inf;

for(int i=1;i<=n;i++)}}

for(int i=0;i<=t;i++) ans=min(ans,ret[n][i]);

printf("%lld\n",n*m-ans);

return 0;

}

題解 lg4158 SCOI2009 粉刷匠

給 n 條每條被劃分成 m 個格仔的木板每個格仔刷顏色,每一次刷只能刷一條木板連續的一段,且每乙個格仔最多只能粉刷一次,一共只能刷 t 次,問能夠正確的刷多少格仔.有乙個很顯然的性質,就是一條木板要是要塗就一定會塗滿但baka fpjo顯然沒有注意到這一點 且還有每乙個格仔最多只能粉刷一次 然後就很...

洛谷 4159 SCOI2009 迷路

題目描述 windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。輸入格式 第一行包含兩個整數,n ...

洛谷 P4159 SCOI2009 迷路

如果邊權為 1 11,則是簡單的矩陣快速冪加速dp遞推方程,又因為邊權並不大,所以考慮拆點,新圖中邊權均為 1 11,將每個點暴力拆成相連的 9 99 個點,對於原先某條邊 u,v,w u,v,w u,v,w 可以轉化為 u uu 拆成的點中第 w ww 個連向 v vv 拆成的點中第 1 11 個...