1. 程式人生 > >Codeforces Round #518 (Div. 2): D. Array Without Local Maximums(DP)

Codeforces Round #518 (Div. 2): D. Array Without Local Maximums(DP)

題意:

有一個長度為n的序列,滿足對於所有的a[x],與它相鄰的兩個元素a[x-1]和a[x+1]中至少有一個大於等於它,其中a[1]和a[n]當然只有一個相鄰元素, 現在這個序列中有些數字被破壞了(標記為-1),問有多少種合法恢復方案(每個數字∈[1,200])

思路:

dp[x][y][0/1/2]表示已經確定了第x個數字為y,且它左面那個數字a[x-1]小於/等於/大於它的總方案個數

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 998244353
LL dp[100005][205][3];		//0<  1=  2>
int a[100005];
int main(void)
{
	LL sum;
	int n, i, j;
	scanf("%d", &n);
	for(i=1;i<=n;i++)
		scanf("%d", &a[i]);
	for(i=1;i<=200;i++)
	{
		if(a[1]==-1 || a[1]==i)
			dp[1][i][0] = 1;
		else
			dp[1][i][0] = 0;
	}
	for(i=2;i<=n;i++)
	{
		for(j=1;j<=200;j++)
		{
			if(a[i]==-1 || a[i]==j)
				dp[i][j][1] = (dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j][2])%mod;
			else
				dp[i][j][1] = 0;
		}
		sum = 0;
		for(j=1;j<=200;j++)
		{
			if(a[i]==-1 || a[i]==j)
				dp[i][j][0] = sum;
			else
				dp[i][j][0] = 0;
			sum = (sum+dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j][2])%mod;
		}
		sum = 0;
		for(j=200;j>=1;j--)
		{
			if(a[i]==-1 || a[i]==j)
				dp[i][j][2] = sum;
			else
				dp[i][j][2] = 0;
			sum = (sum+dp[i-1][j][1]+dp[i-1][j][2])%mod;
		}
	}
	sum = 0;
	for(i=1;i<=200;i++)
		sum = (sum+dp[n][i][1]+dp[n][i][2])%mod;
	printf("%lld\n", sum);
	return 0;
}
/*
2
-1 -1
*/

相關推薦

Codeforces Round #518 (Div. 2): D. Array Without Local MaximumsDP

題意: 有一個長度為n的序列,滿足對於所有的a[x],與它相鄰的兩個元素a[x-1]和a[x+1]中至少有一個大於等於它,其中a[1]和a[n]當然只有一個相鄰元素, 現在這個序列中有些數字被破壞了(標記為-1),問有多少種合法恢復方案(每個數字∈[1,20

Codeforces Round #518 (Div. 2) D. Array Without Local Maximums dp

題目連結:http://codeforces.com/contest/1068/problem/D   題意:        給你n個數,其中有一些數字被遺忘了(被遺忘的數輸入位-1),但是知道所有的數滿足:a1≤a2,an≤an−1

D - Array Without Local Maximums dp

題目連結 題意: 有一個長度為N的序列(2≤n≤1e5)滿足關係: a1≤a2,an≤an−1,ai≤max(ai−1,ai+1)。 每一個ai的範圍是[1,200],有一些ai是確定的,有一些是不確定的,問有多少種情況。答案對998244353取模。   相當於說

Codeforces Round #518 (Div. 2) D計數DP

#include<bits/stdc++.h>using namespace std;const long long mod=998244353;int n;int a[100007];long long dp[100007][207][3];//第i位值為j時k是否成立,k=0,i<i-1

Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum離線樹狀數組

turn string 之前 algorithm printf ace r++ void contest http://codeforces.com/contest/703/problem/D 題意: 給出一行數,有m次查詢,每次查詢輸出區間內出現次數為偶數次的數字的異

Codeforces Round #426 (Div. 2) D. The Bakery(線段樹維護dp)

src lap codeforce blank com date close scanf logs 題目鏈接: Codeforces Round #426 (Div. 2) D. The Bakery 題意: 給你n個數,劃分為k段,每段的價值為這一段不同的數的個數,問如何

Codeforces Round #376 (Div. 2) D. 80-th Level Archeology亂搞

題目連結: 題意: 給你n個字串,每個字串的元素x取值範圍在[1,c],問你能否將所有的x同時進行若干次加1(如果x==c,x變成1)使得字串是按字典序從小到大排序的。輸出最少加的次數,如果沒解

【思維】Codeforces Round #485 (Div. 2) B. High School: Become Human對數

space scanf CA ace ima AC bsp ont http 題目鏈接:http://codeforces.com/contest/987/problem/B 在運算的時候取對數就好了 1 #include <bits/stdc++

Codeforces Round #485 (Div. 2) C題求三元組思維

rip ORC 它的 printf ble CA BE byte order C. Three displays time limit per test 1 second memory limit per test 256 megabytes input s

Codeforces Round #374 (Div. 2)-D Maxim and Array

clu pan air rst main flag lap and class 題目大意:給你n個數,最多有k次操作,每次操作可以將一個任意一個數加上x或者減去x,問你經過k次操作 之後,滿足n個數乘積最小的改變後的序列。 思路:我們先考慮原序列由奇數個負數,那麽我們只

Codeforces 1067A - Array Without Local Maximums 計數dp+詳細推導 (Codeforces Round #518 (Div. 1))

CF: *2000  比起同難度級別的題,dp可真的難做,可能是我做dp的題太少了吧。。。。   題意: 給定一個長度為n(1~ 1e5)的序列a[],其中a[i] 應該在1-200中間,但是有的值看不到了,用-1表示, 但是知道的是對於 1 <

Codeforces Round #510 (Div. 2) D. Petya and Array(離散化+反向樹狀陣列

http://codeforces.com/contest/1042/problem/D 題意 給一個數組n個元素,求有多少個連續的子序列的和<t (1<=n<=200000,abs(a[i])<=1e9) 思路 將公式轉化以下,sum[r]-sum[l-1]&

Codeforces Round #510 (Div. 2) D. Petya and Array (樹狀陣列)

題意:求所有[l,r][ l , r ][l,r]區間和小於TTT的這樣的區間數量。 思路:從lll 到rrr的和小於TTT,即sum(r)−sum(l−1)&lt;Tsum(r)-sum(l

Codeforces Round #473 (Div. 2) - D - Mahmoud and Ehab and another array construction task

題目連結 Mahmoud has an array a consisting of n integers. He asked Ehab to find another array b of the same

Codeforces Round #510 (Div. 2) D. Petya and Array樹狀數組

題解 class 就是 不同的 and std tps query col D. Petya and Array 題目鏈接:https://codeforces.com/contest/1042/problem/D 題意: 給出n個數,問一共有多少個區間,滿足區間和小

Codeforces Round #221 (Div. 2) D

cpp 位置 input memset ont code init cal 矩形 有點郁悶的題目,給了2000ms,可是n,m的範圍已經是5000了。5000 * 5000一般在別的OJ已經是超了2000ms,一開始不敢敲。看了下別人有n*m的潛逃循環,原來CF的機子如

Codeforces Round #271 (Div. 2) D. Flowers 遞推 預處理

int art style eve itl which pop 有一種 esp We saw the little game Marmot made for Mole‘s lunch. Now it‘s Marmot‘s dinner time and, as we

【分類討論】【spfa】【BFS】Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game

邊界情況 code def bfs spa eof scan string amp 那個人第一步肯定要麽能向下走,要麽能向右走。於是一定可以判斷出上下是否對調,或者左右是否對調。 然後他往這個方向再走一走就能發現一定可以再往旁邊走,此時就可以判斷出另一個方向是否對調。 都判

【推導】Codeforces Round #364 (Div. 2) D. As Fast As Possible

std %d while pre 分享 mage oss 時間 http 一種方法是二分總時間,復雜度O(nlogn)。 另外我們可以證明,當所有人同時到達終點的時候,是最優的,因為沒有人的時間“浪費”了。 我們又發現,每個人的運動過程總是兩段,要麽是走路,要麽是坐車。於

Codeforces Round #316 (Div. 2) D. Tree RequestsDFS+狀態壓縮

back push_back init data cti pragma [0 ack false 題意:給定一棵樹,n個節點。每一個節點處有一個字母,結點的深度定義為節點到根結點1的距離, 有m個詢問(u。v),每次回答以結點u為根的子樹的深度為v的那些節點處的字