ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

乌龟棋

2022-08-26 15:03:00  阅读:141  来源: 互联网

标签:分数 cn int MAX luogu 乌龟 define


P1541 [NOIP2010 提高组] 乌龟棋 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 四维dp
  • 从前往后枚举所有可能的状态,对于所有枚举到的状态用当前这步棋不走的分数再加上这个位置的分数的和来更新,比如如果有走a个1步棋,a-1步的分数一定知道,再加上走上这一步将获得的分数来更新状态。
https://www.luogu.com.cn/problem/P1541
#include <bits/stdc++.h>
using namespace std;
#define N 1e5
#define INF 2e9
#define MAX 50

int n, m;
int dp[MAX][MAX][MAX][MAX], value[MAX * 100], nums[5];
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        scanf("%d", value + i);
    for (int i = 1, t; i <= m; i++)
    {
        scanf("%d", &t);
        nums[t]++;
    }
    dp[0][0][0][0] = value[1];
    for (int a = 0; a <= nums[1]; a++)
        for (int b = 0; b <= nums[2]; b++)
            for (int c = 0; c <= nums[3]; c++)
                for (int d = 0; d <= nums[4]; d++)
                {
                    int pos = 1 + a + b * 2 + c * 3 + d * 4;
                    if (a)
                        dp[a][b][c][d] = max(dp[a - 1][b][c][d] + value[pos], dp[a][b][c][d]);
                    if (b)
                        dp[a][b][c][d] = max(dp[a][b - 1][c][d] + value[pos], dp[a][b][c][d]);
                    if (c)
                        dp[a][b][c][d] = max(dp[a][b][c - 1][d] + value[pos], dp[a][b][c][d]);
                    if (d)
                        dp[a][b][c][d] = max(dp[a][b][c][d - 1] + value[pos], dp[a][b][c][d]);
                }
    printf("%d", dp[nums[1]][nums[2]][nums[3]][nums[4]]);
}

 

标签:分数,cn,int,MAX,luogu,乌龟,define
来源: https://www.cnblogs.com/Wang-Xianyi/p/16627548.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有