zoukankan      html  css  js  c++  java
  • P1005 矩阵取数游戏

    题目描述

    帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:

    1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;

    2.每次取走的各个元素只能是该元素所在行的行首或行尾;

    3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);

    4.游戏结束总得分为m次取数得分之和。

    帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

    输入输出格式

    输入格式:

    输入文件game.in包括n+1行:

    第1行为两个用空格隔开的整数n和m。

    第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。

    数据范围:

    60%的数据满足:1<=n, m<=30,答案不超过10^16

    100%的数据满足:1<=n, m<=80,0<=aij<=1000

    输出格式:

    输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大得分。

    输入输出样例

    输入样例#1: 复制
    2 3
    1 2 3
    3 4 2
    
    输出样例#1: 复制
    82


    这里数据特别大,不模拟大整数的话,开__int128
    区间dp
    因为行与行之间没有关联,所以直接单独一行行处理,最后相加求和就行
    dp[i][j]:代表对单独一行来说,左边取i个,右边取j个所得到的最大值
    用dp[i-1][j]和dp[i][j-1]来更新
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 10000
    typedef long long ll;
    #define inf 0x3f3f3f3f
    
    __int128 dp[85][85];
    __int128 f[85];
    int a[100][100];
    int n,m;
    __int128 ans=0;
    __int128 p[100];
    
    void _print(__int128 x)
    {
        if(!x)
        {
            puts("0");
            return;
        }
        if(x > 9) _print(x/10);
        putchar(x%10 + '0');
    }
    void print(__int128 x)
    {
        if(x < 0)
        {
            x = -x;
            putchar('-');
        }
        _print(x);
    }
    int main()
    {
        cin>>n>>m;
        p[0]=1;
        for(int i=1; i<=m; i++)
            p[i]=p[i-1]*2;
    
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                cin>>a[i][j];
    
        for(int k=1; k<=n; k++)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0; i<=m; i++)
                for(int j=0; j<=m-i; j++)
                {
             //注意不能越界
    if(i>=1) dp[i][j]=max(dp[i][j],dp[i-1][j]+a[k][i]*p[i+j]); if(j>=1) dp[i][j]=max(dp[i][j],dp[i][j-1]+a[k][m-j+1]*p[i+j]); f[k]=max(f[k],dp[i][j]); } ans+=f[k]; } print(ans); return 0; }
  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/planche/p/8438113.html
Copyright © 2011-2022 走看看