首页 > 其他分享 >luoguP1005 矩阵取数游戏

luoguP1005 矩阵取数游戏

时间:2024-11-03 15:09:06浏览次数:3  
标签:luoguP1005 p2 每行 int 矩阵 取数 std dp

有n*m的矩阵,每个元素a[i][j]均为非负整数,游戏规则如下:

  1. 每轮从每行各取一个元素,共n个。经过m轮后取完所有元素。
  2. 每次取走的元素只能是该元素所在行的行首或行尾。
  3. 每轮取数都有一个分值,为每行取数的得分之和,每行取数的得分为被取走的元素值乘以2的i次方,其中i为取数轮次,从1开始。
  4. 游戏结束时总得分为m轮取数得分之和。

求可以得到的最大得分。
1<=n,m<=80; 0<=a[i][j]<=1000

分析:加法满足交换律和结合律,可以分别考虑每行的最大得分,然后相加得到总得分,而每行取数就是个区间dp问题。结果很大,需要用高精。

#include <bits/stdc++.h>
using i64 = long long;

// bint模板...

int n, m, A[85][85];
bint p2[85];

void solve() {
    std::cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            std::cin >> A[i][j];
        }
    }

    p2[0] = 1;
    for (int i = 1; i <= m; i++) {
        p2[i] = p2[i - 1] * 2;
    }

    bint ans = 0;
    for (int k = 1; k <= n; k++) {
        bint dp[m + 1][m + 1];
        for (int i = 1; i <= m; i++) {
            dp[i][i] = p2[m] * A[k][i];
        }
        for (int i = 1; i <= m; i++) {
            for (int j = i - 1; j >= 1; j--) {
                dp[j][i] = std::max(dp[j][i], p2[m - i + j] * A[k][j] + dp[j + 1][i]);
                dp[j][i] = std::max(dp[j][i], p2[m - i + j] * A[k][i] + dp[j][i - 1]);
            }
        }
        ans += dp[1][m];
    }
    std::cout << ans << "\n";
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:luoguP1005,p2,每行,int,矩阵,取数,std,dp
From: https://www.cnblogs.com/chenfy27/p/18523466

相关文章

  • Python数据分析NumPy和pandas(十八、从Web APIs 和 数据库中获取数据)
    一、与WebAPIs进行数据交互很多Web网站都提供公共的API,并通过JSON或其他格式提供数据。那Python也有很多种方法可以访问网站提供的API,其中一种常用的方法是通过使用requests库,使用之前需要先安装它,这里通过pip安装:pipinstall requests下面我通过GitHub网站提供的API......
  • 特殊矩阵的压缩存储
    一维数组的存储结构ElemTypearr[10];各数组元素大小相同,且物理上连续存放。 数组元素a[i]的存放地址=LOC+i*sizeof(ElemType)。(LOC为起始地址)二维数组的存储结构ElemTypeb[2][4];二维数组也具有随机存取的特性(需要明确是行优先还是列优先)。 普通矩阵的存......
  • 最大子矩阵和
    最大子矩阵和题目Leetcode:面试题17.24.最大子矩阵给定一个正整数、负整数和0组成的N×M矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组[r1,c1,r2,c2],其中r1,c1分别代表子矩阵左上角的行号和列号,r2,c2分别代表右下角的行号和列号。若有多个满足条件的......
  • 实验7-2-3 求矩阵的局部极大值
     ......
  • C++之OpenCV入门到提高003:矩阵的掩膜(Mask)处理
    一、介绍今天是这个系列《C++之Opencv入门到提高》得第三篇文章。今天这篇文章也不难,主要介绍如何使用Opencv对图像进行掩膜处理,提高图像的对比度。在这个过程中,我们可以学到如何获取图像指针、如何处理像素值越界等问题。我们一步一个脚印的走,收获就会越来越多。虽然......
  • C++——写一函数,将一个3x3的整型矩阵转置。用指针或引用方法处理。
    没注释的源代码#include<iostream>usingnamespacestd;voidmove(int*p);intmain(){  inta[3][3],*p;  cout<<"pleaseinputmatrix:"<<endl;  for(inti=0;i<3;i++)  {    for(intj=0;j<3;j++)    {     ......
  • C++——将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、
    没注释的源代码#include<iostream>#include<stdio.h>#include<string.h>usingnamespacestd;voidtransform(int*arry,intcol_row);intmain(){   intarry[5][5];   cout<<"Pleaseentera5x5matrix:"<<endl;   for(......
  • 获取数据类型js
    functiongetFieldType(field){if(field===null){return'null';}switch(typeoffield){case'undefined':return'undefined';case'string':return&......
  • 59.螺旋矩阵
    题目自己写的:classSolution{public:vector<vector<int>>generateMatrix(intn){vector<vector<int>>res(n,vector<int>(n,0));res[0][0]=1;intk=0;while(n-2*k>0){......
  • markdown矩阵分块和latex中矩阵分块记录
    1.markdown中常见的符号附件\hat{X}\widehat{X}\check{X}\breve{X}\tilde{X}\dot{X}\ddot{X}\overline{X}\underline{X}2.markdown中矩阵由\left[ right],\begin{array}{ccc}\end{array}包围,分行由\\实现,分列通过ccc固定列数,列与列间用&分割代码:\left[\begin......