您的位置:首页 > 其它

LightOJ-1017-Brush (III)

2017-10-21 10:15 393 查看
题目传送门

题意:一个二维平面上有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
[k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: