题目: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; }