题目来源:码蹄集
题目描述:
Python代码实现:
m, n, k = map(int, input().split())
M = []
for i in range(m):
row = list(map(int, input().split()))
M.append(row)
mx = [[0] * k for _ in range(m)]
dp = [[[0] * k for _ in range(n // 2 + 1)] for _ in range(n)]
def pre_process():
for line in range(m):
arr = M[line]
for ii in range(n):
if ii == 0:
for jj in range(n // 2 + 1):
for mod in range(k):
if jj == 0:
if mod == 0:
dp[ii][jj][mod] = 0
else:
dp[ii][jj][mod] = -0x3fffffff
else:
if mod == 0:
if arr[0] % k == 0:
dp[ii][jj][mod] = max(0, arr[0])
else:
dp[ii][jj][mod] = 0
else:
if arr[0] % k == mod:
dp[ii][jj][mod] = arr[0]
else:
dp[ii][jj][mod] = -0x3fffffff
continue
for jj in range(n // 2 + 1):
for mod in range(k):
if jj == 0:
if mod == 0:
dp[ii][jj][mod] = 0
else:
dp[ii][jj][mod] = -0x3fffffff
else:
dp[ii][jj][mod] = dp[ii - 1][jj][mod]
new_mod = (((mod - arr[ii]) % k) + k) % k
dp[ii][jj][mod] = max(dp[ii][jj][mod], arr[ii] + dp[ii - 1][jj - 1][new_mod])
for mod in range(k):
mx[line][mod] = dp[n - 1][n // 2][mod]
D = [[0] * k for _ in range(m)]
pre_process()
for ii in range(m):
if ii == 0:
for mod in range(k):
D[ii][mod] = mx[ii][mod]
continue
for mod in range(k):
D[ii][mod] = D[ii - 1][mod]
for v in range(k):
new_mod = (((mod - v) % k) + k) % k
D[ii][mod] = max(D[ii][mod], mx[ii][v] + D[ii - 1][new_mod])
print(D[m - 1][0])
C++代码实现:
参考链接:https://blog.csdn.net/m0_54754302/article/details/128209412
#include<bits/stdc++.h>
using namespace std;
typedef long long ull;
typedef long long LL;
const int MAX_N = 80;
int m,n,k;
int M[80][80];
ull mx[80][80];
ull dp[80][80][80];
void pre_process(){
for(int line = 0;line<m;line++){
int* arr = M[line];
for(int ii=0;ii<n;ii++){
if(ii==0){
for(int jj=0;jj<=(n>>1);jj++){
for(int mod=0;mod<k;mod++){
if(jj==0){
if(mod==0) dp[ii][jj][mod]=0;
else dp[ii][jj][mod] = -0x3fffffff;
}else{
if(mod==0){
if(arr[0]%k==0)
dp[ii][jj][mod] = max(0,arr[0]);
else
dp[ii][jj][mod]=0;
}else{
if(arr[0]%k == mod)
dp[ii][jj][mod] = arr[0];
else
dp[ii][jj][mod] = -0x3fffffff;
}
}
}
}
continue;
}
for(int jj=0;jj<=(n>>1);jj++){
for(int mod=0;mod<k;mod++){
if(jj==0){
if(mod==0) dp[ii][jj][mod] = 0;
else dp[ii][jj][mod] = -0x3fffffff;
}else{
dp[ii][jj][mod] = dp[ii-1][jj][mod];
int new_mod = (((mod-arr[ii])%k)+k)%k;
dp[ii][jj][mod] = max(dp[ii][jj][mod],arr[ii]+dp[ii-1][jj-1][new_mod]);
}
}
}
}
for(int mod=0;mod<k;mod++){
mx[line][mod] = dp[n-1][n>>1][mod];
}
}
}
ull D[80][80];
int main( )
{
#ifdef TEST
freopen("/Users/grh/Programming/ClionProjects/AlgoCoding/input.txt","r",stdin);
#endif
scanf("%d %d %d",&m,&n,&k);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) scanf("%d",&(M[i][j]));
}
pre_process();
for(int ii=0;ii<m;ii++){
if(ii==0){
for(int mod=0;mod<k;mod++){
D[ii][mod] = mx[ii][mod];
}
continue;
}
for(int mod=0;mod<k;mod++){
D[ii][mod] = D[ii-1][mod];
for(int v=0;v<k;v++){
int new_mod = (((mod-v)%k)+k)%k;
D[ii][mod] = max(D[ii][mod],mx[ii][v]+D[ii-1][new_mod]);
}
}
}
printf("%lld",D[m-1][0]);
return 0;
}
Java代码实现:
import java.util.Scanner;
public class Main {
private static final int MAX_N = 80;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int k = scanner.nextInt();
int[][] M = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
M[i][j] = scanner.nextInt();
}
}
long[][] mx = new long[m][k];
long[][][] dp = new long[n][n / 2 + 1][k];
preProcess(m, n, k, M, mx, dp);
long[][] D = new long[m][k];
for (int ii = 0; ii < m; ii++) {
if (ii == 0) {
for (int mod = 0; mod < k; mod++) {
D[ii][mod] = mx[ii][mod];
}
continue;
}
for (int mod = 0; mod < k; mod++) {
D[ii][mod] = D[ii - 1][mod];
for (int v = 0; v < k; v++) {
int newMod = (((mod - v) % k) + k) % k;
D[ii][mod] = Math.max(D[ii][mod], mx[ii][v] + D[ii - 1][newMod]);
}
}
}
System.out.println(D[m - 1][0]);
}
private static void preProcess(int m, int n, int k, int[][] M, long[][] mx, long[][][] dp) {
for (int line = 0; line < m; line++) {
int[] arr = M[line];
for (int ii = 0; ii < n; ii++) {
if (ii == 0) {
for (int jj = 0; jj <= (n >> 1); jj++) {
for (int mod = 0; mod < k; mod++) {
if (jj == 0) {
if (mod == 0)
dp[ii][jj][mod] = 0;
else
dp[ii][jj][mod] = -0x3fffffff;
} else {
if (mod == 0) {
if (arr[0] % k == 0)
dp[ii][jj][mod] = Math.max(0, arr[0]);
else
dp[ii][jj][mod] = 0;
} else {
if (arr[0] % k == mod)
dp[ii][jj][mod] = arr[0];
else
dp[ii][jj][mod] = -0x3fffffff;
}
}
}
}
continue;
}
for (int jj = 0; jj <= (n >> 1); jj++) {
for (int mod = 0; mod < k; mod++) {
if (jj == 0) {
if (mod == 0)
dp[ii][jj][mod] = 0;
else
dp[ii][jj][mod] = -0x3fffffff;
} else {
dp[ii][jj][mod] = dp[ii - 1][jj][mod];
int newMod = (((mod - arr[ii]) % k) + k) % k;
dp[ii][jj][mod] = Math.max(dp[ii][jj][mod], arr[ii] + dp[ii - 1][jj - 1][newMod]);
}
}
}
}
for (int mod = 0; mod < k; mod++) {
mx[line][mod] = dp[n - 1][n >> 1][mod];
}
}
}
}
代码提交测试结果:
附B站老师讲解链接,可供参考:https://www.bilibili.com/video/BV1ck4y1s7s8/?t=1818.9