2021.1.18寒假打卡Day14
阿新 • • 發佈:2021-01-20
洛谷題單 動態規劃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;
}