这道题大部分时间都在弄高精度……

还是先讲讲dp吧

这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp

f[i][j]表示取了数之后剩下i到j这个区间的最优值

注意这里是取了i之前和j之后的,i到j的数并没有取。

那么这个状态要不是取了第i-1个数转移而来,要不是取了第j+1个数转移而来。

所以可以写出方程 f[i][j] = max(f[i-1][j] + a[i-1] * mi[m-j+i-1], f[i][j+1] + a[j+1] * mi[m-j+i-1]);

然后注意这个区间dp是从大区间推到小区间,不一样。所以枚举的时候要注意区间是从大到小

ans = max(f[i][i] + mi[m])

然后这道题要用高精度。

注意不需要写高精*高精,可以写低精*高精

然后加法那里当前位数一定是+=,因为当前位数可能包含了进位

还要注意位数的调整

这里我弄了好久好久。我干脆趁这个机会搞个模板出来。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 112;
const int base = 10000;
struct node
{
int len, s[505]; //s的范围开太大空间会炸
node() { len = 0; memset(s, 0, sizeof(s)); }
void print()
{
printf("%d", s[len]); //注意第一位不用补0
for(int i = len - 1; i >= 1; i--)
printf("%04d", s[i]);
puts("");
} }f[MAXN][MAXN], mi[MAXN];
int a[MAXN], n, m; node operator + (const node& a, const node& b)
{
node c;
int& len = c.len = max(a.len, b.len);
_for(i, 1, len)
{
c.s[i] += a.s[i] + b.s[i]; //这里一定是+=,不是=
c.s[i+1] += c.s[i] / base;
c.s[i] %= base;
}
if(c.s[len+1] > 0) c.len++;
return c;
} node operator * (const int& a, const node& b)
{
node c;
int& len = c.len = b.len; _for(i, 1, b.len)
{
c.s[i] += b.s[i] * a;
c.s[i+1] += c.s[i] / base;
c.s[i] %= base;
} while(c.s[len+1] > 0) //进位是这么进位的
{
c.len++;
c.s[len+1] += c.s[len] / base;
c.s[len] %= base;
} return c;
} node max(node a, node b)
{
if(a.len > b.len) return a;
else if(a.len < b.len) return b;
else
{
for(int i = a.len; i >= 1; i--)
{
if(a.s[i] > b.s[i]) return a;
else if(a.s[i] < b.s[i]) return b;
}
return a;
}
} int main()
{
mi[0].s[1] = 1; mi[0].len = 1;
_for(i, 1, 80) mi[i] = 2 * mi[i-1];
scanf("%d%d", &n, &m); node ans;
_for(k, 1, n)
{
memset(f, 0, sizeof(f));
_for(i, 1, m) scanf("%d", &a[i]); _for(i, 1, m)
for(int j = m; j >= i; j--)
f[i][j] = max(f[i-1][j] + a[i-1] * mi[m-j+i-1], f[i][j+1] + a[j+1] * mi[m-j+i-1]); node maxt; //为0就直接初始化就好了
_for(i, 1, m)
maxt = max(maxt, f[i][i] + a[i] * mi[m]);
ans = ans + maxt;
}
ans.print(); return 0;
}

洛谷 P1005 矩阵取数游戏 (区间dp+高精度)的更多相关文章

  1. P1005 矩阵取数游戏 区间dp 高精度

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...

  2. 洛谷P1005 矩阵取数游戏

    P1005 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次 ...

  3. [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  4. 洛谷 P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  5. P1005 矩阵取数游戏[区间dp]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...

  6. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

  7. P1005 矩阵取数游戏(动态规划+高精度)

    题目链接:传送门 题目大意: 给定长度为m的数列aj,每次从两端取一个数,得到2k * aj的价值(k为当前的次数,从1开始到m),总共有n行这样的数列,求最大价值总和. 1 ≤ n, m ≤ 80, ...

  8. [luoguP1005] 矩阵取数游戏(DP + 高精度)

    传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...

  9. 【洛谷P1288】取数游戏II

    取数游戏II 题目链接 显然,由于一定有一个0,我们可以求出从初始点到0的链的长度 若有一条链长为奇数,则先手可以每次取完一条边上所有的数, 后手只能取另一条边的数,先手必胜: 反之若没有奇数链,后手 ...

随机推荐

  1. BZOJ 3413 匹配 (后缀自动机+线段树合并)

    题目大意: 懒得概括了 神题,搞了2个半晚上,还认为自己的是对的...一直调不过,最后终于在jdr神犇的帮助下过了这道题 线段树合并该是这道题最好理解且最好写的做法了,貌似主席树也行?但线段树合并这个 ...

  2. 转载一遍比较好的,django2.1搭建博客教程

    非常感谢这位博主,找了几个星期终于找到了 https://www.dusaiphoto.com/article/article-detail/4/

  3. Python及相应软件安装

    Python安装 这是下载地址:Linux下载链接,windows下载链接 1.下载压缩包 wget https://www.python.org/ftp/python/3.7.1/Python-3. ...

  4. MVC、RPC、SOA、微服务架构之间的区别

    MVC.RPC.SOA.微服务架构之间的区别 一.MVC架构 其实MVC架构就是一个单体架构. 代表技术:Struts2.springMVC.Spring.Mybatis 等等. 二.RPC架构 RP ...

  5. 【codeforces 794A】Bank Robbery

    [题目链接]:http://codeforces.com/contest/794/problem/A [题意] 每个位置上可能有物品(>=1)或是没物品 你一开始在某一个位置b; 然后你最左可以 ...

  6. css3特效第一篇--旋转的背景&翻书效果

    一.html遮盖层与css3的旋转动画 >效果图(加载可能会慢一点儿,请稍等...): >实现思路:在一个大的div中装入一个底层img和顶层的div(里面的内容按照以上图片呈现的样式布局 ...

  7. Java 学习(10):java 异常处理

    java 异常处理 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 三种类型的异常: 检查性异常: 最具代表的检查性异 ...

  8. jquery outerHeight方法 outerWidth方法 获取元素实际宽度高度

    曾经写代码中,每当须要获取元素的实际"宽度"(这里的宽度是指元素宽度加上其边距)时,都须要用元素宽度加上margin值才行,今天发现一个叫outerWidth(options)的方 ...

  9. 51nod-1359: 循环探求

    [传送门:51nod-1359] 简要题意: 给出n和k,求出最小的x满足$n^{x}≡n(mod\;10^{k})$ 题解: 真是一道有(du)趣(liu)题目 首先我们设X[k-1]为$n^{x} ...

  10. Java7里try-with-resources分析--转

    原文地址:http://blog.csdn.net/hengyunabc/article/details/18459463 这个所谓的try-with-resources,是个语法糖.实际上就是自动调 ...