#include<bits/stdc++.h>
using namespace std;

const int maxn=405;
const int mod=998244353;
int n,cnt,tot;
int len[maxn],f[maxn][maxn],g[maxn][maxn],dp[maxn][maxn][3];
int h[maxn],c[maxn][maxn],pw2[maxn];
void Add(int &a,int b){
	a+=b;
	if(a>=mod)a-=mod;
}

int solve(int l,int r,int low){
	vector<int>v;
	int high=n+1;
	for(int i=l;i<=r;i++)high=min(high,h[i]);
	for(int i=l;i<=r;i++)if(h[i]>high){
		int j=i;
		while(j<=r&&h[j]>high)j++;
		v.push_back(solve(i,j-1,high));
		i=j-1;
	}
	++cnt;
	len[cnt]=r-l+1;
	for(int i=0;i<=high-low;i++)for(int j=0;j<=len[cnt];j++)
		dp[i][j][0]=dp[i][j][1]=dp[i][j][2]=0;
	dp[0][0][0]=dp[0][0][2]=1;
	int sum=0;
	for(int i=0;i<int(v.size());i++){
		sum+=len[v[i]];
		for(int j=sum;j>=0;j--){
			int ndp0=0,ndp2=0;
			for(int k=0;k<=j&&k<=len[v[i]];k++){
				Add(ndp0,1LL*g[v[i]][k]*dp[0][j-k][0]%mod);
				Add(ndp2,1LL*f[v[i]][k]*dp[0][j-k][2]%mod);
			}
			dp[0][j][0]=ndp0;
			dp[0][j][2]=ndp2;
		}
	}
	for(int i=0;i<high-low;i++)for(int j=0;j<=len[cnt];j++){
		for(int tp=0;tp<=1;tp++){
			int cur=dp[i][j][tp];
			if(!cur)continue;
			Add(dp[i+1][j][1],cur);
			for(int k=0;k<=len[cnt]-j;k++){
				int coef=pw2[j]-(k==0);
				Add(dp[i+1][j+k][tp],1LL*cur*coef%mod*c[len[cnt]-j][k]%mod);
			}
		}
		int cur=dp[i][j][2];
		if(!cur)continue;
		for(int k=0;k<=j;k++){
			int coef=pw2[len[cnt]-j]-(k==0);
			Add(dp[i+1][j-k][2],1LL*cur*coef%mod*c[j][k]%mod);
		}
	}
	for(int j=0;j<=len[cnt];j++){
		Add(g[cnt][j],dp[high-low][j][0]);
		Add(g[cnt][j],dp[high-low][j][1]);
		Add(f[cnt][len[cnt]-j],dp[high-low][j][1]);
		Add(f[cnt][j],dp[high-low][j][2]);
	}
	return cnt;
}

int main(){
	scanf("%d",&n);
	for(int i=0;i<=n;i++)c[i][0]=1;
	pw2[0]=1;
	for(int i=1;i<=n;i++){
		pw2[i]=2LL*pw2[i-1]%mod;
		for(int j=1;j<=n;j++){
			c[i][j]=c[i-1][j-1];
			Add(c[i][j],c[i-1][j]);
		}
	}
	for(int i=1;i<=n;i++)scanf("%d",&h[i]);
	int ans=solve(1,n,0);
	printf("%d\n",f[ans][0]);
	return 0;
}