1. 程式人生 > 其它 >2021.1.18寒假打卡Day14

2021.1.18寒假打卡Day14

技術標籤:大一寒假打卡專用動態規劃

洛谷題單 動態規劃1

P1434 [SHOI2002]滑雪

Michael 喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael 想知道在一個區域中最長的滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個例子:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

一個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度會減小。在上面的例子中,一條可行的滑坡為 24-17-16-1(從 24 開始,在 1 結束)。當然 25-24-23-…-3-2-1 更長。事實上,這是最長的一條。

輸入格式
輸入的第一行為表示區域的二維陣列的行數 R 和列數 C。下面是 R 行,每行有 C 個數,代表高度(兩個數字之間用 1 個空格間隔)。

輸出格式
輸出區域中最長滑坡的長度。

輸入輸出樣例
輸入

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

輸出

25

說明/提示
對於 100% 的資料,1≤R,C≤100。

#include<iostream>
#include<algorithm>
using namespace std;

int h[105][105]={0},dp[105][
105]={0}; int main(){ int r,c,ans=0; cin>>r>>c; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin>>h[i][j]; } } for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(dp[i][j]==0){ if(i-1>0&&h[i-1][j]>h[i][j]) dp[i][j]=max(dp[i-1][j],dp[i][j]); if
(i+1>0&&h[i+1][j]>h[i][j]) dp[i][j]=max(dp[i+1][j],dp[i][j]); if(j-1>0&&h[i][j-1]>h[i][j]) dp[i][j]=max(dp[i][j-1],dp[i][j]); if(j+1>0&&h[i][j+1]>h[i][j]) dp[i][j]=max(dp[i][j+1],dp[i][j]); dp[i][j]+=1; } ans=max(ans,dp[i][j]); } } cout<<ans<<endl; return 0; }

P1002 [NOIP2002 普及組] 過河卒

棋盤上 A 點有一個過河卒,需要走到目標 B 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 C 點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。

棋盤用座標表示,A 點 (0, 0)、B 點 (n, m),同樣馬的位置座標是需要給出的。
在這裡插入圖片描述
現在要求你計算出卒從 A 點能夠到達 B 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入格式
一行四個正整數,分別表示 B 點座標和馬的座標。

輸出格式
一個整數,表示所有的路徑條數。

輸入輸出樣例
輸入

6 6 3 3

輸出

6

說明/提示
對於 100% 的資料,1≤n,m≤20,0≤ 馬的座標 ≤20

#include<iostream>
using namespace std;

int bx,by,mx,my;
unsigned long long f[25][25];
bool s[25][25];

int main(){
    scanf("%d%d%d%d",&bx,&by,&mx,&my);
    bx+=2;by+=2;mx+=2;my+=2;
    
    f[1][2]=1;
    s[mx][my]=1;
    s[mx-2][my+1]=1;s[mx-1][my+2]=1;
    s[mx+1][my+2]=1;s[mx+2][my+1]=1;
    s[mx+2][my-1]=1;s[mx+1][my-2]=1;
    s[mx-1][my-2]=1;s[mx-2][my-1]=1;
    
    for(int i=2;i<=bx;i++){
        for(int j=2;j<=by;j++){
            if(s[i][j]) continue;
            else f[i][j]=f[i-1][j]+f[i][j-1]; 
        }
    }
    printf("%llu\n", f[bx][by]);
    return 0;
}