# noip2010 乌龟棋

## 题目描述

if(i!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-1][j][k][l]+v[r]);

if(j!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-1][k][l]+v[r]);

if(k!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k-1][l]+v[r]);

if(l!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k][l-1]+v[r]);

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define MAXN 10010
#define in(a) a=read()
#define REP(i,k,n)  for(int i=k;i<=n;i++)
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-1;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return x*f;
}
int a,b,c,d;
int v[500],n,m;
int dp[50][50][50][50];
int main(){
in(n),in(m);
REP(i,1,n)  in(v[i]);
int x;
REP(i,1,m){
in(x);
if(x==1) a++;
if(x==2) b++;
if(x==3) c++;
if(x==4) d++;
}
dp[0][0][0][0]=v[1];
REP(i,0,a)
REP(j,0,b)
REP(k,0,c)
REP(l,0,d){
int r=1+i+j*2+k*3+l*4;
if(i!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-1][j][k][l]+v[r]);
if(j!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-1][k][l]+v[r]);
if(k!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k-1][l]+v[r]);
if(l!=0) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k][l-1]+v[r]);
}
cout<<dp[a][b][c][d];
return 0;
}

posted @ 2019-01-30 20:10  Dijkstra·Liu  阅读(539)  评论(0编辑  收藏  举报