zoukankan      html  css  js  c++  java
  • 1068 乌龟棋

    小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

    …… 1 2 3 4 5 ……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择 一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。 游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到 该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的 分数总和。 很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡 片使用顺序使得最终游戏得分最多。 现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到 多少分吗?

    输入描述 Input Description

    输入的每行中两个数之间用一个空格隔开。 第1行2个正整数N和M,分别表示棋盘格子数和爬行卡片数。 第2行N个非负整数,a1a2……aN

    ,其中ai表示棋盘第i个格子上的分数。 第3行M个整数,b1b2……bM

    ,表示M张爬行卡片上的数字。 输入数据保证到达终点时刚好用光M张爬行卡片,即N - 1=∑(1->M) bi

    输出描述 Output Description

    输出一行一个整数

    样例输入 Sample Input

    13 8

    4 96 10 64 55 13 94 53 5 24 89 8 30

    1 1 1 1 1 2 4 1

    样例输出 Sample Output

    455

    数据范围及提示 Data Size & Hint

    【数据范围】

    对于30%的数据有1 ≤ N≤ 30,1 ≤M≤ 12。

    对于50%的数据有1 ≤ N≤ 120,1 ≤M≤ 50,且4 种爬行卡片,每种卡片的张数不会超

    过20。

    对于100%的数据有1 ≤ N≤ 350,1 ≤M≤ 120,且4 种爬行卡片,每种卡片的张数不会

    超过40;0 ≤ ai ≤ 100,1 ≤ i ≤ N;1 ≤ bi ≤ 4,1 ≤ i ≤M。输入数据保证N−1=ΣM

    i b

    1

    用a、b、c、d分别表示1、2、3、4 爬行卡的个数。并依次递归求出每走一步之前的分数加该步走后所在位置的分数即为最大总分数。

    附AC代码:

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 using namespace std;
     5 
     6 int f[41][41][41][41];
     7 int s[351];
     8 
     9 int main(){
    10     int n,m,x;
    11     cin>>n>>m;
    12     int a=0,b=0,c=0,d=0;//用于表示1,2,3,4的个数 
    13     for(int i=0;i<n;i++){
    14         cin>>s[i];
    15     }
    16     for(int i=0;i<m;i++){//爬行牌的统计 
    17         cin>>x;
    18         if(x==1)
    19         a++;
    20         if(x==2)
    21         b++;
    22         if(x==3)
    23         c++;
    24         if(x==4)
    25         d++;
    26     }
    27     
    28     for(int i=0;i<=a;i++){
    29         for(int j=0;j<=b;j++){
    30             for(int k=0;k<=c;k++){
    31                 for(int l=0;l<=d;l++){//计算每走一步之前的大小,再加上走完后该位置的大小 
    32                     if(i!=0)
    33                     f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]);
    34                     if(j!=0)
    35                     f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]);
    36                     if(k!=0)
    37                     f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]);
    38                     if(l!=0)
    39                     f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]);
    40                     f[i][j][k][l]+=s[i+j*2+k*3+l*4];
    41                 }
    42             }
    43         }
    44     }
    45     cout<<f[a][b][c][d]<<endl;
    46     return 0;
    47 } 
  • 相关阅读:
    使用 HtmlInputHidden 控件在本页面保持状态和跨页面传值
    asp.net页面回传与js调用服务端事件、PostBack的原理详解
    关于.net委托的一篇妙文
    C# 基础25问
    存储过程分页
    C#中的格式化字符串
    大批量数据的插入之终极性能提升SqlBulkCopy
    统计某个字符串中指定字符串出现的次数
    powerdesigner 15打开pdm文件弹出安装打印机窗口的解决方法
    Convert.ToInt32(),Int.Parse(),Int.TryParse()的区别
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/5693139.html
Copyright © 2011-2022 走看看