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

    题目背景

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

    题目描述

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

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

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

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

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

    输入格式

    每行中两个数之间用一个空格隔开。

    11行22个正整数N,MN,M,分别表示棋盘格子数和爬行卡片数。

    22行NN个非负整数,a_1,a_2,…,a_Na1,a2,,aN,其中a_iai表示棋盘第ii个格子上的分数。

    33行MM个整数,b_1,b_2,…,b_Mb1,b2,,bM,表示M张爬行卡片上的数字。

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

    输出格式

    11个整数,表示小明最多能得到的分数。

    输入输出样例

    输入 #1
    9 5
    6 10 14 2 8 8 18 5 17
    1 3 1 2 1
    
    输出 #1
    73
    

    说明/提示

    每个测试点1s1s

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

    对于30\%30%的数据有1≤N≤30,1≤M≤121N30,1M12。

    对于50\%50%的数据有1≤N≤120,1≤M≤501N120,1M50,且44种爬行卡片,每种卡片的张数不会超过2020。

    对于100\%100%的数据有1≤N≤350,1≤M≤1201N350,1M120,且44种爬行卡片,每种卡片的张数不会超过4040;0≤a_i≤100,1≤i≤N,1≤b_i≤4,1≤i≤M0ai100,1iN,1bi4,1iM。

    这个题可以说运用了背包的思想:

    开的主要变量:

    1.F[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分

    2.g[x]:表示牌x一共有多少张

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    const int MAXN=55;
    
    int n,m,i,j,f[MAXN][MAXN][MAXN][MAXN],num[351],g[5],x,a,b,c,d;
    
    inline int read(){
        int s=0,w=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-'){
                w=-1;
            }
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            s=s*10+ch-'0';
            ch=getchar();
        }
        return s*w;
    }
    
    int main(){
        n=read();
        m=read();
        for(i=1;i<=n;i++){
            num[i]=read();
        }
        f[0][0][0][0]=num[1];
        for(j=1;j<=m;j++){
            x=read();
            g[x]++;
        }
        for(int a=0;a<=g[1];a++){
            for(int b=0;b<=g[2];b++){
                for(int c=0;c<=g[3];c++){
                    for(int d=0;d<=g[4];d++){
                        int r=1+a+b*2+c*3+d*4;
                        if(a!=0){
                            f[a][b][c][d]=max(f[a][b][c][d],f[a-1][b][c][d]+num[r]);
                        }
                        if(b!=0){
                            f[a][b][c][d]=max(f[a][b][c][d],f[a][b-1][c][d]+num[r]);
                        }
                        if(c!=0){
                            f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-1][d]+num[r]);
                        }
                        if(d!=0){
                            f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-1]+num[r]);
                        }
                    }
                }
            }
        }
        printf("%d",f[g[1]][g[2]][g[3]][g[4]]);
        return 0;
    }
  • 相关阅读:
    如何抓住用户痛点做产品?
    分析需求场景对产品设计的意义
    【用户分析-用户场景】这TM才是产品思维!
    WebUploader实现浏览器端大文件分块上传
    npm 安装包报错 rollbackFailedOptional
    PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)...
    PAT 甲级 1071 Speech Patterns (25 分)(map)
    P3370 【模板】字符串哈希
    PageRank算法原理与Python实现
    PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)...
  • 原文地址:https://www.cnblogs.com/hrj1/p/11478905.html
Copyright © 2011-2022 走看看