最近在洛谷刷題,決定用部落格把自己的解題思路以及踩過的坑整理總結一下~
先來看看題目吧~
棋盤上 aa 點有乙個過河卒,需要走到目標 bb 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 cc 點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。
棋盤用座標表示,aa 點 (0, 0)(0,0)、bb 點 (n, m)(n,m),同樣馬的位置座標是需要給出的。
現在要求你計算出卒從 aa 點能夠到達 bb 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入格式
一行四個正整數,分別表示 bb 點座標和馬的座標。
輸出格式
乙個整數,表示所有的路徑條數。
思路剛拿到題的時候,有點不知道怎麼做,只覺得要用動態規劃,但是沒有想好方程是怎麼樣的。
錯得離譜的思路就不說了,說說還不錯的思路。
定義乙個陣列用來存到該點的路徑條數,路徑條數怎麼得到呢?
往下看因為只能向下或向右去走,所以到乙個點只有通過它左邊的路或上邊的路
那麼來了!!!
到某點的路徑條數=到它左邊點的條數+到它上面點的條數(前提是這兩點都可到)。
這時候我們想一想就可以得到動態規劃方程
了
不過我這裡倒是犯了乙個錯誤,我想當然的把到邊線上的點的路徑條數預設成1了,雖然一般情況適用,可是當馬的控制範圍包含了某個邊線上的點時,是wa了!
真正到邊線上的點的路徑條數應該是他的上乙個點的條數(上邊界就是它左邊的點,左邊姐就是它上邊的點)
if(i==0&&j>0)//上邊界
else if(j==0&&i>0)//左邊界
那麼還有乙個特殊點,就是原點(起點),到它的路徑條數是多少呢?
很明顯,就是1了
if(i==0&&j==0)//原點
a[i][j]=1;
剩下的點就是普通點了,到它們的路徑條數當然就是到它左邊點的條數+到它上面點的條數
else
要注意!!我們討論的這三類點都是在它可到達的情況下討論的,也就是說不受馬控制的點,那麼怎麼實現呢?
當然在外面加一層if判斷就好了!
好了,到這裡,方程就基本出來了,剩下的就看**吧,呼呼~
#include
using
namespace std;
intmain()
for(int i=1;i<=m;i++)
*///動態規劃求到各點的路數
for(
int i=
0;i<=n;i++
)else
if(j==
0&&i>0)
else}}
} cout<[m]
}
over,這道題就結束了~~第一次寫部落格,如果有幫到大家,非常榮幸,寫得不好,也請見諒,啦啦 P1002 NOIP2002 普及組 過河卒
棋盤上 aa 點有乙個過河卒,需要走到目標 bb 點。卒行走的規則 可以向下 或者向右。同時在棋盤上 cc 點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,aa 點 0,0 0,0 bb 點 n,m n,m 同樣馬的位置座標是需要給出的...
NOIP 2002 普及組 數字遊戲
題目鏈結 題目分析 這道題是一道區間dp題,跟能量項鍊還有石子合併差不多,我們用f i j l 表示處理i到j這一區間分為l段所能得到的最大值或是最小值。具體看 程式 include include include include include using namespace std int n,...
NOIP2002 普及組 選數
題目描述 已知 n 個整數 x1,x2,xn,以及乙個整數 k k n 從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。例如當 n 4,k 3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為 3 7 12 22 3 7 19 29 7 12 19 38 3 12 1...