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. 每次取数时须从每 ...
随机推荐
- php中调用mysql的存储过程和存储函数
//$sql = 'call del()'; 调用存储过程 del(参数列表)//mysql_query($sql); $sql = "insert into t values (1, f ...
- rpm方式安装gcc缺少依赖项的解决方法
使用rpm方式安装gcc时,有时会报缺少依赖项: libmpfr.so.1 is needed by cpp-4.4.4-13.el6.i686 libppl.so.7 is needed by cl ...
- JS判断是否微信浏览器
JS判断是否微信浏览器 function isWeixinBrowser(){ var ua = navigator.userAgent.toLowerCase(); return (/microme ...
- Jquery Offset, Document, Window 都是什么
From http://www.cnblogs.com/luhe/archive/2012/11/14/2769263.html JQuery Offset实验与应用 我们有时候需要实现这样一种功 ...
- Tips of Python!
Tips of Python!(Python 2.7) (不定期更新中-) 1. raw_input() 和 input(): raw_input() 将输入原封不动的保存为一个字符串 输入 1 + ...
- hdu 4746 Mophues 莫比乌斯反演+前缀和优化
Mophues 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<=n, 1<=b<=m) 有Q组数据:(n, m, ...
- 闲谈前端编码解码、C#编码解码。
最近做项目,出现中文乱码的问题,特地研究一下. GB2312,指的是中文 UTF8,指的是国标,包含中文.英文. 但是通过JQuery.ajax的Get.Post,如果直接传递中文或者特殊字符的特使字 ...
- C# Windows Service调用IBM Lotus Notes发送邮件
近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf ...
- Unity3d Shader开发(三)Pass(Texturing )
纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成. SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用 ...
- 关于appStore评分的相关说明--转自张诚教授
在iOS7以前,评分地址如下 itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?typ ...