Ural 1346

来源:互联网 发布:不用网络的导航 编辑:程序博客网 时间:2024/05/22 02:11

PRO IS HERE


将序列分成最少的段,每段都是非递减,或者非递增的。


dp: dp[i][0]  表示到i点是非递增的划分数

      dp[i][1]   表示到i点是非递减的划分数


#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<set>#include<queue>#include<map>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define bug puts("Fuck");#define LL long long#define pb push_back#define mp make_pair#define nMax 101000#define eps 1e-8#define inf 0x7fffffffint s[nMax];int dp[nMax][2];int a,b,n;void sovle(){dp[0][0]=dp[0][1]=1;FOR(i,1,n) {if(s[i-1] > s[i]) {dp[i][0] = min(dp[i-1][0],dp[i-1][1]+1);dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + 1;}else if(s[i-1] < s[i]) {dp[i][0] = min(dp[i-1][0],dp[i-1][1]) + 1;dp[i][1] = min(dp[i-1][0]+1,dp[i-1][1]);}else { dp[i][0] = min(dp[i-1][0],dp[i-1][1]+1) ; dp[i][1] = min(dp[i-1][0]+1,dp[i-1][1]);}//printf("%d - %d %d\n",i,dp[i][0],dp[i][1]);}int ans = min(dp[n][0],dp[n][1]);printf("%d\n",ans);}int main(){#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);freopen("output.txt","w",stdout);#endifwhile(~scanf("%d%d",&a,&b)){FOR(i,0,b-a)scanf("%d",&s[i]);n=b-a;sovle();}return 0;}