【atcoder abc281_d】動態規劃
阿新 • • 發佈:2022-12-11
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) throwsIOException { 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(); } }