#include<bits/stdc++.h>
using namespace std;
const int N=402;
const int mod=998244353;
const int inf=1e9+2;
void add(int &x,int y){
	x+=y;
	if(x>=mod){
		x-=mod;
	}
}
int mul(int x,int y){
	return (1ll*x*y)%mod;
}
int h[N],c[N][N],pw2[N];
vector<vector<int> > calc(int lef,int rig,int senda){
	int i,j,k,min1=inf,lst=lef-1,cnt=0,sz=rig-lef+1;
	bool fst=true;
	vector<vector<int> > ans;
	ans.resize(2);
	for(i=0;i<2;i++){
		ans[i].resize(sz+1);
	}
	for(i=lef;i<=rig;i++){
		if(min1>h[i]){
			min1=h[i];
			cnt=0;
		}
		if(min1==h[i]){
			cnt++;
		}
	}
	if(min1>senda){
		vector<vector<int> > temp=calc(lef,rig,senda+1);
		for(i=0;i<=sz;i++){
			add(ans[0][i],temp[1][i]);
			add(ans[0][i],mul(pw2[sz-i]-1,temp[0][i]));
			add(ans[1][i],temp[1][i]);
			add(ans[1][i],mul(pw2[sz-i]-1,temp[1][i]));
			for(j=i+1;j<=sz;j++){
				add(ans[0][i],mul(mul(temp[0][j],c[j-i][j]),pw2[sz-j]));
				add(ans[1][i],mul(mul(temp[1][j],c[j-i][j]),pw2[sz-j]));
			}
		}	//true
	}
	else{
		if(min1==senda){
			if(cnt==sz){
				ans[0][0]=pw2[sz]-1;
				ans[0][sz]=1;
				for(i=0;i<=sz;i++){
					ans[1][i]=c[sz-i][sz];
				}
				//true
			}
			else{
				vector<vector<int> > temp1=calc(lef,rig,senda+1);
				vector<vector<int> > temp;
				temp.resize(2);
				for(i=0;i<2;i++){
					temp[i].resize(sz+1);
				}
				for(i=0;i<=sz;i++){
					temp[0][i]=temp1[0][i];
					if(i+cnt<=sz){
						temp[1][i+cnt]=temp1[1][i];
					}
				}
				for(i=0;i<=sz;i++){
					add(ans[0][i],temp[1][i]);
					add(ans[0][i],mul(pw2[sz-i]-1,temp[0][i]));
					add(ans[1][i],temp[1][i]);
					add(ans[1][i],mul(pw2[sz-i]-1,temp[1][i]));
					for(j=i+1;j<=sz;j++){
						add(ans[0][i],mul(mul(temp[0][j],c[j-i][j]),pw2[sz-j]));
						add(ans[1][i],mul(mul(temp[1][j],c[j-i][j]),pw2[sz-j]));
					}
				}	//true
			}
		}
		else{
			assert(min1<senda);
			cnt=0;
			for(i=lef;i<=rig;i++){
				if(h[i]==min1){
					if(lst+1<=i-1){
						vector<vector<int> > temp=calc(lst+1,i-1,senda);
						sz=i-lst-1;
						if(fst){
							for(j=0;j<2;j++){
								for(k=0;k<temp[j].size();k++){
									ans[j][k]=temp[j][k];
								}
							}
							fst=false;
						}
						else{
							vector<vector<int> > cac;
							cac.resize(2);
							for(j=0;j<2;j++){
								cac[j].resize(rig-lef+2);
							}	
							// cout<<cnt<<' '<<sz<<" CHECK1"<<endl;
							for(j=0;j<=cnt;j++){
								for(k=0;k<=sz;k++){
									add(cac[0][j+k],mul(ans[0][j],temp[0][k]));
									add(cac[1][j+k],mul(ans[1][j],temp[1][k]));
								}
							}
							swap(ans,cac);
						}
						cnt+=sz;
					}
					lst=i;
				}
				else{
					if(i==rig&&lst+1<=i){
						vector<vector<int> > temp=calc(lst+1,i,senda);
						sz=i-lst;
						if(fst){
							for(j=0;j<2;j++){
								for(k=0;k<temp[j].size();k++){
									ans[j][k]=temp[j][k];
								}
							}
							fst=false;
						}
						else{
							vector<vector<int> > cac;
							cac.resize(2);
							for(j=0;j<2;j++){
								cac[j].resize(rig-lef+2);
							}
							for(j=0;j<=cnt;j++){
								for(k=0;k<=sz;k++){
									add(cac[0][j+k],mul(ans[0][j],temp[0][k]));
									add(cac[1][j+k],mul(ans[1][j],temp[1][k]));
								}
							}
							swap(ans,cac);
						}
						cnt+=sz;
					}
				}
			}
		}
	}
	// cout<<"DP:"<<lef<<' '<<rig<<' '<<senda<<endl;
	// sz=rig-lef+1;
	// for(i=0;i<2;i++){
	// 	cout<<i<<' ';
	// 	for(j=0;j<=sz;j++){
	// 		cout<<ans[i][j]<<' ';
	// 	}
	// 	cout<<endl;
	// }
	// cout<<"END"<<endl;
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,i,j,k,l;
	cin>>n;
	pw2[0]=c[0][0]=1;
	for(i=1;i<=n;i++){
		cin>>h[i];
		pw2[i]=mul(pw2[i-1],2);
		for(j=0;j<=i;j++){
			add(c[j][i],c[j][i-1]);
			if(j){
				add(c[j][i],c[j-1][i-1]);
			}
		}
	}
	vector<vector<int> > ans=calc(1,n,1);
	cout<<ans[0][0];
}

Measured memory_bytes: 2432