結果
| 問題 |
No.484 収穫
|
| コンテスト | |
| ユーザー |
ixmel
|
| 提出日時 | 2017-04-09 18:34:34 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 243 ms / 3,000 ms |
| コード長 | 1,864 bytes |
| コンパイル時間 | 909 ms |
| コンパイル使用メモリ | 104,900 KB |
| 実行使用メモリ | 97,408 KB |
| 最終ジャッジ日時 | 2024-10-13 13:16:10 |
| 合計ジャッジ時間 | 4,499 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 |
ソースコード
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdio>
#include<sstream>
#include<iomanip>
#include<assert.h>
#define loop(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mt make_tuple
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef pair<int,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-7;
const int inf=1e8;
const ll INF=1e16;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
ll n;
cin>>n;
vi in(n);
rep(i,n)cin>>in[i];
if(n==1){
cout<<in[0]<<endl;
return 0;
}
vector<vvi>dp(2,vvi(n,vi(n,INF)));
dp[0][1][n-1]=in[0];
dp[1][0][n-2]=in[n-1];
queue<tuple<ll,ll,ll,ll> >que;
que.push(mt(0,1,n-1,in[0]));
que.push(mt(1,0,n-2,in[n-1]));
ll out=INF;
while(!que.empty()){
ll a,b,c,d;
tie(a,b,c,d)=que.front();
que.pop();
if(dp[a][b][c]<d)continue;
// cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
if(b==c){
out=min(out,max(in[b],d+1));
continue;
}
ll t=0;
if(!a){
t=max(in[b],d+1);
if(dp[a][b+1][c]>t){
dp[a][b+1][c]=t;
que.push(mt(a,b+1,c,t));
}
t=max(in[c],d+c-b+1);
if(dp[1][b][c-1]>t){
dp[1][b][c-1]=t;
que.push(mt(1,b,c-1,t));
}
}else{
t=max(in[b],d+c-b+1);
if(dp[0][b+1][c]>t){
dp[0][b+1][c]=t;
que.push(mt(0,b+1,c,t));
}
t=max(in[c],d+1);
if(dp[a][b][c-1]>t){
dp[a][b][c-1]=t;
que.push(mt(a,b,c-1,t));
}
}
}
cout<<out<<endl;
}
ixmel