# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
67292 | theknife2001 | 휴가 (IOI14_holiday) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include"holiday.h"
#include <bits/stdc++.h>
using namespace std;
const int N=3055;
long long dp[N][N*3];
bool vis[N];
int a[N];
int n;
long long bt(int i , int d)
{
if(d==0)
return 0;
// if(dp[i][d]!=-1)
// return dp[i][d];
if(d==1)
{
if(!vis[i])
dp[i][d]=a[i];
else
dp[i][d]=0;
return dp[i][d];
}
long long ret=0;
if(i+1<n)
ret=max(bt(i+1,d-1),ret);
if(i)
ret=max(bt(i-1,d-1),ret);
if(i+1<n&&!vis[i])
{
vis[i]=1;
ret=max(bt(i+1,d-2)+a[i],ret);
vis[i]=0;
}
if(i&&!vis[i])
{
vis[i]=1;
ret=max(bt(i-1,d-2)+a[i],ret);
vis[i]=0;
}
dp[i][d]=ret;
return ret;
}
long long int findMaxAttraction(int m, int start, int d, int ar[])
{
memset(dp,-1,sizeof dp);
n=m;
for(int i=0;i<n;i++)
a[i]=ar[i];
return bt(start,d);
}
int main() {
int n, start, d;
int attraction[100000];
int i, n_s;
n_s = scanf("%d %d %d", &n, &start, &d);
for (i = 0 ; i < n; ++i) {
n_s = scanf("%d", &attraction[i]);
}
printf("%lld\n", findMaxAttraction(n, start, d, attraction));
return 0;
}