地址:http://www.luogu.org/problem/show?pid=1541#
分析:
简单的动态规划
一开始我定义的状态是f[i][j][k][l],i是当前格数,jkl是前三种卡片数,则由m-i-k-l可得第四种卡片数,然后发现数组太大开不下来。
然后又定义f[i][j][k][l]为4种卡片各用了多少,则当前格数可得。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmaxn=355,Tmaxm=125;
int n,m,a[Tmaxn],num[5],f[Tmaxm][Tmaxm][Tmaxm][Tmaxm];
void work()
{
int i,j,k,l;
f[0][0][0][0]=a[1];
for(i=0;i<=num[1];i++)
for(j=0;j<=num[2];j++)
for(k=0;k<=num[3];k++)
for(l=0;l<=num[4];l++)
{
if(i==0&&j==0&&k==0&&l==0) continue;
if(i-1>=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]);
if(j-1>=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]);
if(k-1>=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]);
if(l-1>=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]);
f[i][j][k][l]+=a[1+i+j*2+k*3+l*4];
}
//else f[i][j][k][l]=TTmax(f[i][j][k][l-1],f[i][j][k-1][l],f[i][j-1][k][l],f[i-1][j][k][l])+a[i*1+j*2+k*3+l*4];
return;
}
int main()
{
int i,tmp;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
{
scanf("%d",&tmp);
num[tmp]++;
}
work();
printf("%d",f[num[1]][num[2]][num[3]][num[4]]);
return 0;
}