Codevs_1166_[NOIP2007]_矩阵取数游戏_(动态规划+高精度)
描述
http://codevs.cn/problem/1166/
分析
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=; struct Bign{
int x[maxn],cnt;
int & operator [] (int id){ return x[id]; }
Bign(){ memset(x,,sizeof x); }//空的构造函数
Bign(int num){ *this=num; }//赋一个数字的构造函数
Bign(char* num){ *this=num; }//赋一个字符串数字的构造函数
Bign operator = (const char* num){//字符串的赋值函数
memset(x,,sizeof x); cnt=strlen(num);
for(int i=;i<=cnt;i++) x[i]=num[cnt-i-]-'';
return *this;
}
Bign operator = (int num){//数字的赋值函数
memset(x,,sizeof x); cnt=;
while(num){
x[++cnt]=num%;
num/=;
}
return *this;
}
Bign operator + (Bign y) const{//加法
Bign z; z.cnt=max(cnt,y.cnt);
for(int i=;i<=z.cnt;i++){
z[i]+=x[i]+y[i];
if(z[i]>=) z[i+]++, z[i]-=;
}
if(z[z.cnt+]) z.cnt++;//加法至多多出一位
return z;
}
Bign operator - (Bign y) const{//减法
Bign z; z.cnt=cnt;
for(int i=;i<=z.cnt;i++){
z[i]+=x[i]-y[i];
if(z[i]<) z[i+]--, z[i]+=;
}
while(z.cnt&&!z[z.cnt]) z.cnt--;//减法可能会少很多位
return z;
}
Bign operator * (Bign y) const{//乘法
Bign z;
for(int i=;i<=cnt;i++)
for(int j=;j<=y.cnt;j++)
z[i+j-]+=x[i]*y[j],z[i+j]+=z[i+j-]/, z[i+j-]%=;
z.cnt=cnt+y.cnt;//乘法后结果的位数为cnt1+cnt2或cnt1+cnt2-1.
if(!z[z.cnt]) z.cnt--;
return z;
}
Bign operator / (Bign y) const{//除法
Bign z=*this,d=;
for(int i=cnt;i;i--){
d=d*+x[i];
for(int j=;j<;j++)
if(d<y*(j+)){
z[i]=j;
d=d-y*j;
break;
}
}
while(z.cnt&&!z[z.cnt]) z.cnt--;
return z;
}
Bign operator % (Bign y) const{//取模
Bign d=;
for(int i=cnt;i;i--){
d=d*+x[i];
for(int j=;j<;j++)
if(d<y*(j+)){
d=d-y*j;
break;
}
}
return d;
}
Bign &operator += (Bign y){ *this=*this+y; return *this; }
Bign &operator -= (Bign y){ *this=*this-y; return *this; }
Bign &operator *= (Bign y){ *this=*this*y; return *this; }
Bign &operator /= (Bign y){ *this=*this/y; return *this; }
Bign &operator %= (Bign y){ *this=*this%y; return *this; } bool operator < (Bign y){
if(cnt!=y.cnt) return cnt<y.cnt;
for(int i=cnt;i;i--)
if(x[i]!=y[i]) return x[i]<y[i];
return false;
}
bool operator > (Bign y){ return y<*this; }
bool operator <= (Bign y){ return!(y<*this); }
bool operator >= (Bign y){ return!(*this<y); }
bool operator != (Bign y){ return y<*this||*this<y; }
bool operator == (Bign y){ return!(y<*this)&&!(*this<y); }
}dp[][],a[][],ans;
istream& operator >> (istream &in,Bign &x){//输入
char s[maxn];
scanf("%s",s+); int len=strlen(s+);
for(int i=len;i;i--)
x[len+-i]=s[i]-'';
x.cnt=len;
return in;
}
ostream& operator << (ostream &out,Bign &x){//输出
for(int i=x.cnt;i;i--)
out << x[i];
if(!x.cnt) out << ;
return out;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
Bign t=;
for(int i=;i<=m;i++) t*=;
for(int i=;i<=n;i++){
memset(dp,,sizeof dp);
for(int j=;j<=m;j++){
cin >> a[i][j];
dp[j][j]=t*a[i][j];
}
Bign tmp=t;
for(int k=;k<=m;k++){
tmp/=;
for(int l=;l<=m-k+;l++){
int r=l+k-;
if(dp[l+][r]+a[i][l]*tmp>dp[l][r-]+a[i][r]*tmp)
dp[l][r]=dp[l+][r]+a[i][l]*tmp;
else
dp[l][r]=dp[l][r-]+a[i][r]*tmp;
}
}
ans+=dp[][m];
}
cout << ans <<endl;
return ;
}
Codevs_1166_[NOIP2007]_矩阵取数游戏_(动态规划+高精度)的更多相关文章
- P1005 矩阵取数游戏(动态规划+高精度)
题目链接:传送门 题目大意: 给定长度为m的数列aj,每次从两端取一个数,得到2k * aj的价值(k为当前的次数,从1开始到m),总共有n行这样的数列,求最大价值总和. 1 ≤ n, m ≤ 80, ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- [luoguP1005] 矩阵取数游戏(DP + 高精度)
传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...
- 【NOIP2007】矩阵取数
因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...
随机推荐
- eclipse导入包的快捷键
在Eclipse里,写一个没有导入相应包的类名(这个类名已经完全写全,比如LayoutManager), 可以用ctrl+shift+M/Ctrl+Shift+o/Ctrl+1导入相应的包. 其中Ct ...
- C++对象模型与内存位对齐的简单分析(GNU GCC&VS2015编译器)
以Fruit和Apple为例进行分析: Fruit和Apple的定义如下: 通过在两种编译环境下的测试(GNU GCC & VS2015),可以发现这两种编译器的对象模型是一样的,如下图所示: ...
- PC软件-实用工具 True Launch Bar
True Launch Bar 官网 增强及自定义window任务栏快捷方式管理. 有免费版的Free Launch Bar 官网
- setInterval()与setTimeout()计时器
JavaScript是单线程语言,但是它可以通过设置超时值和间歇时间值来指定代码在特定的时刻执行.超时值是指在指定时间之后执行代码,间歇时间值是指每隔指定的时间就执行一次代码. 超时调用 超时调用使用 ...
- jQuery实现鼠标移到元素上动态提示消息框效果
当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...
- django 中的延迟加载技术,python中的lazy技术
---恢复内容开始--- 说起lazy_object,首先想到的是django orm中的query_set.fn.Stream这两个类. query_set只在需要数据库中的数据的时候才 产生db ...
- 使用ajaxFileUpload实现异步上传图片
index.html <head runat="server"> <title></title> <script src="jq ...
- EL四大作用域 9个jsp对象有效范围 及 对应的类
java中request,session,application的作用范围 page,request,session,application四者的作用范围: page的作用范围是当前页面:对应El表达 ...
- 上下切换js
<div class="wview"> <span class="prevs" id="prevs-j"></ ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...