zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Linux下MySQL主从同步配置
    Tortoisegit图文使用教程
    C语言I博客作业06
    第十周助教总结
    C语言I博客作业04
    C语言I博客作业02
    第十一周助教总结
    第十二周助教总结
    第九周助教总结
    C语言I博客作业02
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11151187.html
Copyright © 2011-2022 走看看