[luoguP1005] 矩阵取数游戏(DP + 高精度)
和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP
不过高精度非常恶心,第一次写,调了我一上午。
——代码
#include <cstdio>
#include <cstring>
#include <iostream> struct Big_int
{
int s[], idx;
Big_int()
{
idx = ;
memset(s, , sizeof(s));
}
}; int n, m;
Big_int ans, a[], f[][]; inline void clear(Big_int &x)
{
x.idx = ;
memset(x.s, , sizeof(x.s));
} inline Big_int Big(int x)
{
Big_int ret;
while(x)
{
ret.s[ret.idx] = x % ;
x /= ;
ret.idx++;
}
return ret;
} inline bool operator > (const Big_int x, const Big_int y)
{
int i;
if(x.idx > y.idx) return ;
else if(x.idx < y.idx) return ;
else for(i = x.idx - ; i >= ; i--)
if(x.s[i] > y.s[i]) return ;
else if(x.s[i] < y.s[i]) return ;
} inline Big_int Max(const Big_int x, const Big_int y)
{
return x > y ? x : y;
} inline int max(int x, int y)
{
return x > y ? x : y;
} inline Big_int operator + (const Big_int x, const Big_int y)
{
int i;
Big_int ret;
ret.idx = max(x.idx, y.idx) + ;
for(i = ; i < ret.idx; i++)
{
ret.s[i] += x.s[i] + y.s[i];
ret.s[i + ] += ret.s[i] / ;
ret.s[i] %= ;
}
while(!ret.s[ret.idx - ] && ret.idx > ) ret.idx--;
return ret;
} inline Big_int operator * (const Big_int x, const Big_int y)
{
int i, j;
Big_int ret;
ret.idx = x.idx + y.idx;
for(i = ; i < x.idx; i++)
for(j = ; j < y.idx; j++)
{
ret.s[i + j] += x.s[i] * y.s[j];
ret.s[i + j + ] += ret.s[i + j] / ;
ret.s[i + j] %= ;
}
while(!ret.s[ret.idx - ] && ret.idx > ) ret.idx--;
return ret;
} inline void print(const Big_int x)
{
int i;
if(!x.idx) printf("");
else for(i = x.idx - ; i >= ; i--) printf("%d", x.s[i]);
puts("");
} inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline Big_int dp(int x, int y, Big_int z)
{
if(f[x][y].idx) return f[x][y];
if(x == y) return f[x][y] = a[x] * z;
else return f[x][y] = Max(dp(x + , y, z * Big()) + a[x] * z, dp(x, y - , z * Big()) + a[y] * z);
} int main()
{
int i, j;
n = read();
m = read();
while(n--)
{
for(i = ; i <= m; i++) a[i] = Big(read());
for(i = ; i <= m; i++)
for(j = ; j <= m; j++)
clear(f[i][j]);
ans = ans + dp(, m, Big());
}
print(ans);
return ;
}
[luoguP1005] 矩阵取数游戏(DP + 高精度)的更多相关文章
- [LuoguP1005]矩阵取数游戏 (DP+高精度)
题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...
- 【Luogu】P1005矩阵取数游戏(高精度+DP)
题目链接 yeah终于过辣! DP,f[i][j]表示每行还剩i到j这个区间的数没取的时候的值.借这个题我也把高精度的短板弥补了一下,以后高精加高精乘应该是没问题了. 哇终于不怂高精了…… 放上代码. ...
- [P1005][NOIP2007] 矩阵取数游戏 (DP+高精)
我不会高精…… 也不会DP…… 这道题即考高精又考DP…… 我要死了 给一个不是高精的代码(当然不能满分) #include<cstdio> #include<iostream> ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- P1005 矩阵取数游戏[区间dp]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...
- 矩阵取数游戏 2007年NOIP全国联赛提高组(dp+高精)
矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description [问题描述]帅帅经常跟 ...
- 矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...
- 矩阵取数游戏洛谷p1005
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
随机推荐
- 双栈排序 2008年NOIP全国联赛提高组(二分图染色)
双栈排序 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Tom最近在研究一个有 ...
- SP2916 GSS5 - Can you answer these queries V
给定一个序列.查询左端点在$[x_1, y_1]$之间,且右端点在$[x_2, y_2]$之间的最大子段和,数据保证$x_1\leq x_2,y_1\leq y_2$,但是不保证端点所在的区间不重合 ...
- Extjs grid禁用头部点击三角下拉菜单
表格头部的三角在点击的时候禁止出现下拉菜单,给每一列添加属性menuDisabled:true xtype:'grid', enableColumnResize:false, columns:[ {t ...
- 【转】Linux系统编程---dup和dup2详解
正常的文件描述符: 在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表.看下图: 打开文件的内核数据结构 dup和dup2两个函 ...
- CF379F New Year Tree
题意翻译 你是一个程序猿,现在有一棵新年树(并不是传统的带着叶子的树)--它有四个节点: 1,2,3,4. 其中2,3,4的父亲都是1. 新年里,程序猿们往往会做一些有趣的事情.你则选择以往这棵树上加 ...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...
- 02—IOC实现项目中的解耦
- js解析地址栏参数
/** * 获取地址栏中url后面拼接的参数 * eg: * 浏览器地址栏中的地址:http://1.1.1.1/test.html?owner=2db08226-e2fa-426c-91a1-66e ...
- HTML空格占位
它叫不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的 ...
- offset家族基本简介
Offset家族简介 offset这个单词本身是--偏移,补偿,位移的意思. js中有一套方便的获取元素尺寸的办法就是offset家族: offsetWidth和offsetHight 以及offse ...