【发布时间】:2015-11-17 05:35:25
【问题描述】:
问题陈述:
您位于 (x1,x2,...,xN) 位置的 N 维网格中。网格的尺寸为 (D1,D2,...DN)。一步,你可以在 N 个维度中的任何一个维度上向前或向后走一步。 (所以总是有 2×N 可能的不同动作)。你有多少种方法可以走 M 步,这样你在任何时候都不会离开网格?如果在任意点 xi,xi≤0 或 xi>Di,则离开网格。
输入格式
第一行包含测试用例 T 的数量。接下来是 T 测试用例。对于每个测试用例,第一行包含 N 和 M,第二行包含 x1,x2,…,xN,第三行包含 D1,D2,…,DN。
输出格式
输出 T 行,一个对应每个测试用例。由于答案可能非常大,因此以 1000000007 为模输出。
约束
1≤T≤10
1≤N≤10
1≤M≤300
1≤Di≤100
1≤xi≤Di
示例输入
1
2 3
1 1
2 3
样本输出
12
如果这是 1D 的解决方案可以是这样的:solve(i+1)+solve(i-1);
在2D中:solve(i+1,j)+solve(i-1,j)+solve(i,j+1)+solve(i,j-1);我如何为 N 维编程?他们是否有一些用于制作上述递归语句的一般步骤,这有助于制作递归语句
我看到的大多数解决方案都是自下而上或自上而下的方式,我无法理解它们?是他们理解他们的任何方式吗,因为我一直使用递归 + 记忆练习 dp,我发现很难理解他们
如何做记忆?使用哪种数据结构?,在哪里使用模 1e 7(仅在最终答案中)??
更新 感谢 BARNEY 的解决方案,但在大多数情况下获得 TLE 如何更快地做到这一点 代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
public class Grid_Walking {
private static String[] n;
private static int moves;
private static HashMap<String, Integer> hm;
private static BufferedReader br;
private static String[] s;
private static int dimen;
private static int[] present;
private static int[] dimlen;
public static void main(String args[]) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t > 0) {
n = br.readLine().split(" ");
dimen = Integer.parseInt(n[0]);
present = new int[dimen];
dimlen = new int[dimen];
moves = Integer.parseInt(n[1]);
s = br.readLine().split(" ");
for (int i = 0; i < dimen; i++) {
present[i] = Integer.parseInt(s[i]) - 1;
}
s = br.readLine().split(" ");
for (int i = 0; i < dimen; i++) {
dimlen[i] = Integer.parseInt(s[i]);
}
hm = new HashMap<String, Integer>();
System.out.println(solve(present, moves) % 1000000007);
t--;
}
}
private static int solve(int[] x, int moves) {
// TODO Auto-generated method stub
int result = 0;
String s = Arrays.toString(x) + moves;
if (hm.containsKey(s)) {
return hm.get(s);
}
if (moves == 0) {
return 1;
}
for (int i = 0; i < dimen; i++) {
// System.out.println("fjfvnfjbv");
if (x[i] > 0) {
x[i] = x[i] - 1;
result = result + solve(x, moves - 1);
x[i] = x[i] + 1;
}
if (x[i] < dimlen[i] - 1) {
x[i] = x[i] + 1;
result = result + solve(x, moves - 1);
x[i] = x[i] - 1;
}
}
hm.put(s, result % 1000000007);
return result % 1000000007;
}
}
【问题讨论】:
-
@Barney 递归工作
标签: recursion dynamic-programming