题意:给n个格子,每个格子有一个对应的分数
给m张牌 每张牌上有对应的步数
tortoise从第一个格子出发
每次使用一张牌 前进的步数为牌上的数字
每到一格 把格子上的数字加入分数
求最大的分数
主要思路:要抓住题目里说的 牌的种数是有限的
只有4种
用每种牌使用了多少来做状态
#include<iostream> #include<cstdio> #define go(i,u,v) for(register int i=u;i<=v;i++) using namespace std; int read() { int x=0,y=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();} while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();} return x*y; } int n,m,cd[5],sc[360],f[50][50][50][50]; int main() { n=read();m=read(); go(i,1,n) sc[i]=read(); go(i,1,m) {int x=read();cd[x]++;} f[0][0][0][0]=sc[1]; go(a,0,cd[1]) go(b,0,cd[2]) go(c,0,cd[3]) go(d,0,cd[4]){ int x=a*1+b*2+c*3+d*4+1; if(a>0) f[a][b][c][d]=max(f[a][b][c][d],f[a-1][b][c][d]+sc[x]); if(b>0) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-1][c][d]+sc[x]); if(c>0) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-1][d]+sc[x]); if(d>0) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-1]+sc[x]); } printf("%d",f[cd[1]][cd[2]][cd[3]][cd[4]]); return 0; }