乌龟棋

                                                                                                                                                                                                     这里是题目呀

题意:给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;
}
View Code

 

posted @ 2019-01-22 19:46  DTTTTTTT  阅读(167)  评论(0编辑  收藏  举报