題目描述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 個...