• 洛谷 P1541 乌龟棋


    题目背景

    小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。

    题目描述

    乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

    乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。

    游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。

    很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。

    现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?

    输入输出格式

    输入格式:

    输入文件的每行中两个数之间用一个空格隔开。

    第1行2个正整数N和M,分别表示棋盘格子数和爬行卡片数。

    第2行N个非负整数,a1a2……aN,其中ai表示棋盘第i个格子上的分数。

    第3行M个整数,b1b2……bM,表示M张爬行卡片上的数字。

    输入数据保证到达终点时刚好用光M张爬行卡片。

    输出格式:

    输出只有1行,1个整数,表示小明最多能得到的分数。

    输入输出样例

    输入样例#1:

    9 5
    6 10 14 2 8 8 18 5 17
    1 3 1 2 1
    

    输出样例#1:

    73
    

    说明

    每个测试点1s
    小明使用爬行卡片顺序为1,1,3,1,2,得到的分数为6+10+14+8+18+17=73。注意,由于起点是1,所以自动获得第1格的分数6。

    对于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。

    解题思路

    这是一个多维背包问题,维度为四,可以通过一个四重循环递推实现

    DP方程:f[a,b,c,d]=max(f[a-1,b,c,d],f[a,b-1,c,d],f[a,b,c-1,d],f[a,b,c,d-1])+g[a+b*2+c*3+d*4+1]

     1 program wuguiqi;
     2 var f:array[-1..40,-1..40,-1..40,-1..40] of longint;
     3     sco:array[0..350] of longint;
     4     card:array[0..120] of longint;
     5     b:array[1..4] of longint;
     6     i,j,k,l,m,n:longint;
     7 function max(e,f,c,d:longint):longint;
     8 begin
     9     if (e>=f) and (e>=c) and(e>=d) then exit(e);
    10     if (f>=e) and (f>=c) and(f>=d) then exit(f);
    11     if (c>=e) and (c>=f) and(c>=d) then exit(c);
    12     if (d>=e) and (d>=f) and(d>=c) then exit(d);
    13 end;
    14 begin
    15     read(m,n);//m 格子数 n 卡片数
    16     for i:=1 to m do read(sco[i]);//格子分数
    17     for i:=1 to n do
    18     begin
    19       read(card[i]);//卡片分数
    20       inc(b[card[i]]);
    21     end;
    22     fillchar(f,sizeof(f),0);
    23 
    24     for i:=0 to b[1] do
    25         for j:=0 to b[2] do
    26             for k:=0 to b[3] do
    27                 for l:=0 to b[4] do
    28                 f[i,j,k,l]:=max(f[i-1,j,k,l],f[i,j-1,k,l],f[i,j,k-1,l],f[i,j,k,l-1])+sco[i+j*2+k*3+l*4+1];
    29     writeln(f[b[1],b[2],b[3],b[4]]);
    30 
    31 end.
  • 相关阅读:
    不支持ie9一下代码
    jquery ajax done 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
    WaitMe是一款使用CSS3来创建加载动画的jQuery插件
    Masked Input这个jQuery插件让用户能够按照预先设定好的固定格式输入数据(如日期、电话号码等)
    Autosize插件允许textarea元素根据录入的内容自动调整元素的高度
    两个列表选项插件bootstrap-duallistbox.js
    jquery滚动插件slimscroll
    modernizr.custom.js应用
    bootbox基于bootstrap的扩展弹窗
    洛谷P3503 [POI2010]KLO-Blocks 单调栈
  • 原文地址:https://www.cnblogs.com/wuminyan/p/4731130.html
Copyright © 2020-2023  润新知