1. 程式人生 > 其它 >洛谷P1002過河卒java100分題解

洛谷P1002過河卒java100分題解

題目描述如圖:

這道題我以前以回溯的方法做,只能拿到60分

現在才發現是道動態規劃題

解題思路:

建立一個(0,0)到終點打小的二維陣列表示棋盤

每個座標的值為此位置到終點的路數

最下方一排和最右方一列如果沒有馬的控制點,能到終點的路數為1

如圖所示:

從下向上,從右向左遍歷,每個格子到終點的路數等於下方的格子的值+右方的格子的值

如果遇到馬的控制點,則不計算這個格子

完整程式碼如下:

import java.util.Scanner;

public class DP1 {
    public static void main(String[] args) {
        Scanner sc
=new Scanner(System.in); //建立棋盤 int a=sc.nextInt(); int b=sc.nextInt(); a++; b++; long[][] qp=new long[a][b]; //建立馬 int n=sc.nextInt(); int m=sc.nextInt(); //如果馬的控制點在棋盤內 設定為0 qp[n][m]=-1; if (n-1>=0&&m-2>=0){ qp[n
-1][m-2]=-1; } if (n-1>=0&&m+2<b){ qp[n-1][m+2]=-1; } if (n-2>=0&&m-1>=0){ qp[n-2][m-1]=-1; } if (n-2>=0&&m+1<b){ qp[n-2][m+1]=-1; } if (n+1<a&&m-2>=0){ qp[n
+1][m-2]=-1; } if (n+1<a&&m+2<b){ qp[n+1][m+2]=-1; } if (n+2<a&&m-1>=0){ qp[n+2][m-1]=-1; } if (n+2<a&&m+1<b){ qp[n+2][m+1]=-1; } //將棋盤下方邊和右方邊初始化為1 for (int i = a-1; i>=0; i--) { if (qp[i][b-1]==-1){ break; } qp[i][b-1]=1; } for (int i = b-1; i >=0; i--) { if (qp[a-1][i]==-1){ break; } qp[a-1][i]=1; } for (int i = a-2; i >= 0; i--) { for (int j = b-2; j >= 0; j--) { if (qp[i][j]==-1){ continue; } if (qp[i+1][j]==-1&&qp[i][j+1]==-1){ continue; } if (qp[i+1][j]<0){ qp[i][j]=qp[i][j+1]; continue; } if (qp[i][j+1]<0){ qp[i][j]=qp[i+1][j]; continue; } qp[i][j]=qp[i+1][j]+qp[i][j+1]; } } System.out.println(qp[0][0]); } }