洛谷 1005 JZOJ 1181 矩阵取数游戏#区间dp#

题目描述

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

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

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

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

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

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


题目分析

采用区间型dp
状态转移方程:
f [ i ] [ i + l e n ] f[i][i+len] f[i][i+len]表示取数 i i i i + l e n i+len i+len的最大值
f [ i ] [ i + l e n ] = m a x ( 2 ∗ f [ i + 1 ] [ i + l e n ] + 2 ∗ a [ i ] , 2 ∗ f [ i ] [ i + l e n − 1 ] + 2 ∗ a [ i + l e n ] ) f[i][i+len]=max(2*f[i+1][i+len]+2*a[i],2*f[i][i+len-1]+2*a[i+len]) f[i][i+len]=max(2f[i+1][i+len]+2a[i]2f[i][i+len1]+2a[i+len])
取左边和取右边的最大值,用类似于秦九韶算法代替2的乘方。请注意使用高精度或__ i n t 128 int128 int128


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define lll __int128
using namespace std;
int n,m,a[82]; lll f[82][82],ans;
int in(){
    int ans=0; char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans;
}
void print(lll ans){
    if (!ans) return; 
    else print(ans/10);
    putchar(ans%10+48);
}
lll dp(int *a){
    memset(f,0,sizeof(f));
    for (int len=0;len<=m;len++)
    for (int i=1;i+len<=m;i++)
    f[i][i+len]=max(2*f[i+1][i+len]+2*a[i],2*f[i][i+len-1]+2*a[i+len]);//动态规划
    return f[1][m];
}
int main(){
    n=in(); m=in();
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++) a[j]=in();
        ans+=dp(a);
    }
    if (ans) print(ans); else putchar('0');
    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2017游戏大厅大全,就在搜狗游戏大厅 2017火爆的网页游戏,就在搜狗游戏大厅点击下载游戏大厅, yxdt.sogou.com · 2018-1-27 · 搜狗广告 矩阵取数游戏 - Vijos 描述 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵矩阵中的每个元素aij据为非负整数。游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个。 https://vijos.org/p/1378 p1378 - Vijos 矩阵取数游戏 (game.pas/c/cpp) 【问题描述】 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵矩阵中的每个元素aij均为非负整数。游戏规则 ... https://vijos.org/discuss/5109fde44e4112501400074b 2009-9-15 错别字 - Vijos #论字打的快的后果 帅帅经常**更同学**玩一个矩阵取数游戏:对于一个给定的n×m的矩阵矩阵中的每个元素aij**据为**非负整数。 更同学->跟同学 据为非负 ... https://vijos.org/discuss/57c2840f17f3ca4a05f6a0ad 2016-8-28 我知道估计没人解答,我自己看了都长的程序 - Vijos 矩阵取数游戏 登录后创建讨论 查看题目 登录后递交 讨论 题解 信息 ID 1378 难度 6 分类 动态规划 | 高精度 点击显示 标签 NOIP 2007 提高组 递交数 4072 已通过 956 23% ... https://vijos.org/discuss/5109fddf4e411250140003d0 2009-7-12 难得过了,简单的栽了。请指点! - Vijos / Vijos / 讨论 / 矩阵取数游戏 / 难得过了,简单的栽了。请指点! 矩阵取数游戏 Lemon tree LV 8 @ 2009-07-27 18:34:33 编译通过... ├ 测试数据 01 ... https://vijos.org/discuss/5109fde04e4112501400049d 2009-7-27 讨论 - Vijos

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值