思路:用记忆化,p[i][j] 代表第 i 个格子,在上一个格子走 j 步到这个格子。
两个样例都能过,却只拿了十分??
自造数据也都能过啊。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=355;
int ans,p[N][5],a[N],l[5],n,m;
void wyd(int u,int sum,int tp){
if(p[u][tp] > sum)return;
p[u][tp]=sum;
if(u==n)return;
for(int i=1;i<=4;i++){
if(l[i] && u+i<=n){
--l[i];
wyd(u+i,sum+a[u+i],i);
++l[i];
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int u;
cin>>u;
++l[u];
}
wyd(1,a[1],0);
cout<<max({p[n][1],p[n][2],p[n][3],p[n][4]});
return 0;
}