LightOJ-1017-Brush (III)


題目傳送門


題意:一個二維平面上有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章