HihoCoder 1044 - 状态压缩 (状态压缩DP)

思路

$dp[i][s]$,表示前i个位置,按照s中的位置扫垃圾的最大值。

枚举状态。如果当前位置有扫,就加上权,不然就取第i-m个位置选不选的最大值。

代码

int w[MAXN];
int dp[MAXN][1<<10];
 
int main()
{
    //ROP;
    int n, m, q;
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j < (1<<min(i, m)); j++)
        {
            if (__builtin_popcount(j) > q) continue;
            if (~j & 1) dp[i][j] = max(dp[i-1][j>>1], dp[i-1][(j>>1) + (1<<m-1)]);
            else dp[i][j] = max(dp[i-1][j>>1], dp[i-1][(j>>1) + (1<<m-1)]) + w[i];
        }
    }
    int ans = 0;
    for (int i = 0; i < (1<<min(m, n)); i++) ans = max(ans, dp[n][i]);
    printf("%d\n", ans);
    return 0;
}

Powered by Jekyll and Theme by solid