题目链接:https://ac.nowcoder.com/acm/contest/301/F
刚开始看到题目的时候,没有怎么想就写了一发dfs暴力。。然后tle了,之后同学和我说这题看数据可以开三维,dp来做,后来想了想,确实可以。
AC代码:
import java.util.Scanner;
/*
* 直接dfs会超时,所以转换成三维dp
*/
public class Main {
static int n,m,k;
static int res[][]={{2,1},{2,-1},{1,2},{1,-2},{-2,1},{-2,-1},{-1,2},{-1,-2}};
static boolean isin(int x,int y){
return x>=0&&x<n&&y>=0&&y<m;
}
static int mod=1000000007;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
n=sc.nextInt();
m=sc.nextInt();
k=sc.nextInt();
int dp[][][]=new int[k+1][n][m];
dp[0][0][0]=1;
for(int i=0;i<k;i++){
for(int j=0;j<n;j++){
for(int z=0;z<m;z++){
for(int y=0;y<8;y++){
int tj=j+res[y][0];
int tz=z+res[y][1];
if(isin(tj,tz)&&dp[i][j][z]>0){
dp[i+1][tj][tz]=(dp[i+1][tj][tz]+dp[i][j][z])%mod;
}
}
}
}
}
System.out.println(dp[k][n-1][m-1]);
}
sc.close();
}
}