洛谷 P1541 乌龟棋 —— DP

题目:https://www.luogu.org/problemnew/show/P1541

DP。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=355,xm=45;
int n,m,a[xn],s[5],f[xm][xm][xm][xm];
int rd()
{
  int ret=0,f=1; char ch=getchar();
  while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}
  while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
  return f?ret:-ret;
}
int main()
{
  n=rd(); m=rd();
  for(int i=1;i<=n;i++)a[i]=rd();
  for(int i=1,x;i<=m;i++)x=rd(),s[x]++;
  f[0][0][0][0]=a[1];
  for(int i=1;i<=m;i++)
    for(int j=0;j<=min(s[1],i);j++)
      for(int k=0;k<=min(s[2],i-j);k++)
        for(int l=0;l<=min(s[3],i-j-k);l++)
          {
              int t=i-j-k-l;
            f[j][k][l][t]=a[1+j+2*k+3*l+4*(i-j-k-l)];
            int ret=0;
            if(j)ret=max(ret,f[j-1][k][l][t]);
            if(k)ret=max(ret,f[j][k-1][l][t]);
            if(l)ret=max(ret,f[j][k][l-1][t]);
            if(i-j-k-l)ret=max(ret,f[j][k][l][t-1]);
            f[j][k][l][t]+=ret;
          }
  printf("%d
",f[s[1]][s[2]][s[3]][s[4]]);
  return 0;
}
原文地址:https://www.cnblogs.com/Zinn/p/9757362.html