AT360 雨上がり (#動態規劃 -1.12)
阿新 • • 發佈:2018-12-11
題目翻譯
給定一條長為N的路,每一單位的路段可能為 X (水坑)或 . (空地),要求經過最少的水坑到達N這裡,每一步可以走1、2、3單位長的距離。
感謝@xusiyuan 提供的翻譯
輸入輸出格式
輸入格式:
入力は以下の形式で標準入力から與えられる.
$ N $
$ S $
- 11 行目に區間の數を表す NN ( 3\ ≦\ N\ ≦\ 1003 ≦ N ≦ 100 ) が與えられる.
- 22 行目には, NN 文字の文字列 SS が與えられる.これらは道路の區間のデータである.
- SS に出現する文字は '.', 'X' のいずれかであり,意味は上に記した通りである.
- SS の最初と最後の文字は必ず '.' である.
輸出格式:
最低限踏まなければならない水たまりの數を標準出力に 11 行で出力せよ.
なお、最後には改行を出力せよ.
輸入輸出樣例
輸入樣例#1:
5 .XXX.
輸出樣例#1
1
輸入樣例#2
10 .X.XXXXXX.
輸出樣例#2
2
輸入樣例#3
7
.......
輸出樣例#3
0
思路
dp的練手題,本題有3個狀態:走1步、走2步、走3步。
#include <stdio.h> #include <iostream> using namespace std; int dp[1001],n;//第i個元素存走到i時最少經過的水坑數 char s[1001]; int main() { ios::sync_with_stdio(false); cin.tie(0); int i,j; cin>>n; cin>>s; for(i=0;i<n;i++)//初始化 { if(s[i]=='X') { dp[i]=1; } } for(i=3;i<n;i++) { if(s[i]=='X')//如果是水坑,從哪過來都得溼 { dp[i]=min(dp[i-3],min(dp[i-2],dp[i-1]))+1; } else//如果不是水坑 { dp[i]=min(dp[i-3],min(dp[i-2],dp[i-1])); } } cout<<dp[n-1]<<endl; return 0; }