題意:一個二維平面上有N個灰塵,有一個寬度爲w的刷子,一次可以刷一個w寬度的橫線範圍內的所有灰塵,只能刷k次,求刷的灰塵最多有多少。
思路:動態規劃,dp[i][j]表示前i個灰塵刷j次最多可以刷掉的灰塵數。狀態轉移方程爲dp[i][j] = max(dp[i][j], dp[p-1][j-1]+sum)
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int T, cas=1;
scanf("%d", &T);
while (T--)
{
int n, w, k;
scanf("%d %d %d", &n, &w, &k);
int y[110];
for (int i = 1; i <= n; i++)
scanf("%*d %d", &y[i]);
int dp[110][110];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
dp[i][j] = dp[i-1][j];
int sum = 0;
for (int p = i; p >= 1; p--)
{
if (y[i]-y[p]>w)
break;
sum++;
dp[i][j] = max(dp[i][j], dp[p-1][j-1]+sum);
}
}
}
printf("Case %d: %d\n", cas++, dp[n][k]);
}
return 0;
}