• P1541 乌龟棋


    99%的WA都是因为手残

    P1541 乌龟棋

    题解

    这题可以用DP做

    首先记录下棋盘上的分数,然后开一个数组记录每种卡片的数目

    下面关键:

    dp[ ][ ][ ][ ]  四维DP记录每种卡片各用了多少张时得到的最大分数

    ans就是把所有卡片都用上时的分数啦

    代码

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<cstdlib>
    
    using namespace std;
    
    int n,m;
    int pan[355],card[5],dp[45][45][45][45];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          scanf("%d",&pan[i]);
        for(int i=1;i<=m;i++)
        {
            int k;
            scanf("%d",&k);
            card[k]++;
        }
        
        dp[0][0][0][0]=pan[1];
        
        for(int i=0;i<=card[1];i++)
          for(int j=0;j<=card[2];j++)
            for(int k=0;k<=card[3];k++)
              for(int l=0;l<=card[4];l++)
              {
                  int pos=1+i*1+j*2+k*3+l*4;  //用了这些卡片后走到的位置 
                  if(i) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-1][j][k][l]+pan[pos]);
                  if(j) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-1][k][l]+pan[pos]);
                  if(k) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k-1][l]+pan[pos]);
                  if(l) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k][l-1]+pan[pos]);
                //确保这种卡片数目不为0才可以选择,然后转移 
              }
        
        printf("%d
    ",dp[card[1]][card[2]][card[3]][card[4]]);
        
        return 0;
    }
  • 相关阅读:
    stl rope
    vijos1574 摇钱树
    图论 Dijkstra+堆优化
    c++输入优化
    Vijos1579 宿命的PSS 最小生成树
    快速求n阶多项式乘积
    c++stl map
    C#函数式程序设计之惰性列表工具——迭代器
    C#函数式程序设计之泛型(下)
    C#函数式程序设计之泛型(上)
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11151187.html
Copyright © 2020-2023  润新知