您的位置:首页 > 其它

普及练习场 更要技巧的动规与记忆化 乌龟棋

2018-01-15 16:10 232 查看
题目链接

题意理解

代码中dp[i][j][k][l] 表示使用了i张1,j张2,k张3,l张4能走到的最大数。

代码

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

public class Main {
static int N, M;
static int maxn = 400;
static int[] cnt = new int[5];
static int[] a = new int[maxn];
static int maxm = 50;
static int[][][][] dp = new int[maxm][maxm][maxm][maxm];
public static void main(String[] args) {
FastScanner fs = new FastScanner();
N = fs.nextInt();
M = fs.nextInt();
for(int i = 1; i <= N; i++) {
a[i] = fs.nextInt();
}
for(int i = 0; i < M; i++) {
int x = fs.nextInt();
cnt[x]++;
}

for(int i = 0; i <= cnt[1]; i++) {
for(int j = 0; j <= cnt[2]; j++) {
for(int k = 0; k <= cnt[3]; k++) {
for(int l = 0; l <= cnt[4]; l++) {
dp[i][j][k][l] = mmax(
dp[Math.max(i-1, 0)][j][k][l],
dp[i][Math.max(j-1, 0)][k][l],
dp[i][j][Math.max(k-1, 0)][l],
dp[i][j][k][Math.max(l-1, 0)]) + a[1 + i * 1 + j * 2 + k * 3 + l * 4];

}
}
}
}
System.out.println(dp[cnt[1]][cnt[2]][cnt[3]][cnt[4]]);
}

public static int mmax(int a, int b, int c, int d) {
int t1 = Math.max(a, b);
int t2 = Math.max(t1, c);
int t3 = Math.max(t2, d);
return t3;
}

public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}

public String nextToken() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return st.nextToken();
}

public int nextInt() {
return Integer.valueOf(nextToken());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: