1. 程式人生 > >AT360 雨上がり (#動態規劃 -1.12)

AT360 雨上がり (#動態規劃 -1.12)

題目翻譯

給定一條長為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


思路

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;
}