【atcoder abc281_d】动态规划

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author fishcanfly
 */
public class Main {
    /**
     * main入口由OJ平台调用
     */
    static long[][] lcs = null;
    static int n, k, d;
    static long[] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] words = br.readLine().split("\\s+");
        n = Integer.valueOf(words[0]);
        k = Integer.valueOf(words[1]);
        d = Integer.valueOf(words[2]);

        arr = new long[n];
        long[][][] dp = new long[n + 1][k + 1][d + 1];
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= k; j++) {
                for (int x = 0; x <= d; x++) {
                    dp[i][j][x] = -1;
                }
            }
        }
        words = br.readLine().split("\\s+");
        for (int i = 0; i < n; i++) {
            arr[i] = Long.valueOf(words[i]);
        }

        dp[0][0][0] = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= k; j++) {
                for (int m = 0; m < d; m++) {
                    if (dp[i][j][m] == -1) continue;

                    // transition when a_i isn't chosen
                    dp[i + 1][j][m] = Math.max(dp[i + 1][j][m], dp[i][j][m]);

                    // transition when a_i is chosen
                    if( j+1<=k){
                        dp[i + 1][j + 1][(m + (int) arr[i])% d] = Math.max(dp[i + 1][j + 1][(m + (int) arr[i])% d], dp[i][j][m] + arr[i]);
                    }
                }
            }
        }


        System.out.println(dp[n][k][0]);

        br.close();
    }


}

 

posted @ 2022-12-11 16:04  fishcanfly  阅读(58)  评论(0)    收藏  举报
//雪花飘落效果