#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<bitset>
#include<set>
#define N (410)
#define P (998244353)
#define M (10010)
#define inf (0x7f7f7f7f)
#define rg register int
#define Label puts("NAIVE")
#define spa print(' ')
#define ent print('\n')
#define rand() (((rand())<<(15))^(rand()))
#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
typedef long double ld;
typedef long long LL;
typedef unsigned long long ull;
using namespace std;
namespace fastIO1{
	inline char read(){
		static const int IN_LEN=1000000;
		static char buf[IN_LEN],*s,*t;
		return (s==t?t=(s=buf)+fread(buf,1,IN_LEN,stdin),(s==t?-1:*s++):*s++);
	}
	template<class T>
	inline void read(T &x){
		static bool iosig;
		static char c;
		for(iosig=false,c=read();!isdigit(c);c=read()){
			if(c=='-')iosig=true;
			if(c==-1)return;
		}
		for(x=0;isdigit(c);c=read())x=((x+(x<<2))<<1)+(c^'0');
		if(iosig)x=-x;
	}
	inline char readc(char &c){
		for(c=read();!isalpha(c)&&!isdigit(c);c=read())
		if(c==-1)return 0;
	}
	const int OUT_LEN = 10000000;
	char obuf[OUT_LEN],*ooh=obuf;
	inline void print(char c){
		if(ooh==obuf+OUT_LEN)fwrite(obuf,1,OUT_LEN,stdout),ooh=obuf;
		*ooh++=c;
	}
	template<class T>
	inline void print(T x){
		static int buf[30],cnt;
		if(x==0)print('0');
		else{
			if(x<0)print('-'),x=-x;
			for(cnt=0;x;x/=10)buf[++cnt]=x%10+48;
			while(cnt)print((char)buf[cnt--]);
		}
	}
	inline void flush(){fwrite(obuf,1,ooh-obuf,stdout);}
}
namespace fastIO2{
	template<class T>
	inline void read(T &x){
		static bool iosig;
		static char c;
		for(iosig=false,c=getchar();!isdigit(c);c=getchar()){
			if(c=='-')iosig=true;
			if(c==-1)return;
		}
		for(x=0;isdigit(c);c=getchar())x=((x+(x<<2))<<1)+(c^'0');
		if(iosig)x=-x;
	}
}
using namespace fastIO1;
int n,id,H[N],f[M][N],g[M][N],len[M];
int tf[N],tg[N],C[N][N],pw[N];
void add(int &x,int y){
	x=x+y>P?x+y-P:x+y;
}
void init(){
	pw[0]=C[0][0]=1;
	for(int i=1;i<=400;i++)add(pw[i]=pw[i-1],pw[i-1]);
	for(int i=1;i<=400;i++){
		C[i][0]=1;
		for(int j=1;j<=i;j++)
		C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;
	}
}
void update(int t,int x){
	for(int i=0;i<=len[t]+len[x];i++)tf[i]=tg[i]=0;
	for(int i=0;i<=len[t];i++)
	for(int j=0;j<=len[x];j++){
		add(tf[i+j],1ll*f[t][i]*f[x][j]%P);
		add(tg[i+j],1ll*g[t][i]*g[x][j]%P);
	}
	len[t]+=len[x];
	for(int i=0;i<=len[t];i++)f[t][i]=tf[i],g[t][i]=tg[i];
}
int solve(int L,int R,int lst){
	if(L>R)return 0; int mid=L,nw=++id;
	for(int i=L;i<=R;i++)if(H[i]<H[mid])mid=i;
	int lc=solve(L,mid-1,H[mid]),rc=solve(mid+1,R,H[mid]);
	len[nw]=f[nw][0]=g[nw][0]=1; 
	if(lc)update(nw,lc); if(rc)update(nw,rc);
	int l=len[nw];
	for(int i=1;i<=H[mid]-lst;i++){
		for(int j=0;j<=l;j++)tf[j]=tg[j]=0;
		if(i==1){
			int p=0;
			for(int j=L;j<=R;j++)if(H[j]==H[mid])p++;
			for(int j=0;j<=l-p;j++){
				add(tf[j+p],1ll*(pw[j]-1)*f[nw][j]%P);
				add(tg[j],1ll*(pw[j]-1)*g[nw][j]%P);
				add(tf[j],g[nw][j]),add(tg[j],g[nw][j]);
				for(int a=0;a+j<=l-p;a++)
				for(int b=0;b<=p;b++)
				if(a|b){
					int tmp=1ll*C[l-j-p][a]*C[p][b]%P*pw[j]%P;
					add(tf[j+a+p],1ll*tmp*f[nw][j]%P);
					add(tg[j+a+b],1ll*tmp*g[nw][j]%P);
				}
			}
		}
		else{
			for(int j=0;j<=l;j++){
				add(tf[j],1ll*(pw[j]-1)*f[nw][j]%P);
				add(tg[j],1ll*(pw[j]-1)*g[nw][j]%P);
				add(tf[j],g[nw][j]),add(tg[j],g[nw][j]);
				for(int k=1;j+k<=l;k++){
					int tmp=1ll*C[l-j][k]*pw[j]%P;
					add(tf[j+k],1ll*tmp*f[nw][j]%P);
					add(tg[j+k],1ll*tmp*g[nw][j]%P);
				}
			}
		}
		for(int j=0;j<=l;j++)f[nw][j]=tf[j],g[nw][j]=tg[j];
	}
	return nw;
}
int main(){
	read(n);
	for(int i=1;i<=n;i++)read(H[i]);
	init(); int rt=solve(1,n,0); printf("%d\n",f[rt][n]);
} 

Measured memory_bytes: 5700