描述


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]_矩阵取数游戏_(动态规划+高精度)的更多相关文章

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

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

  2. 洛谷1005 【NOIP2007】矩阵取数游戏

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

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

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

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

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

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

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

  6. NOIP2007 矩阵取数游戏

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

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

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

  8. 矩阵取数游戏 NOIP 2007

    2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...

  9. 【NOIP2007】矩阵取数

    因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...

随机推荐

  1. fgetc, getchar(), fscanf的问题

    1.漫谈:为什么 函数fscanf(FILE stream, const char format, ...)的 第3个参数中 总是用变量的地址 或者是用指针. 这个问题涉及到 传值 和 传指针.一般情 ...

  2. Cabarc Overview (Microsoft TechNet)

    Original Link:  Cabarc Overview Applies To: Windows Server 2003, Windows Server 2003 R2, Windows Ser ...

  3. ssh连接失败解决方法

    执行如下命令: ssh-keygen -t dsa -P '' -f /etc/ssh/ssh_host_dsa_key ssh-keygen -t rsa -P '' -f /etc/ssh/ssh ...

  4. GZIP 头解析

    在用HttpWebRequest对象时,一般我们都没有开启gzip压缩,如果服务端返回的数据比较大,这是我们需要开启gzip压缩,怎么开启呢? 1.给HttpWebRequest对象,添加如下Head ...

  5. 重新安装Ubuntu12.04

    重新安装Ubuntu12.04 之所以我重新安装Ubuntu,因为我第一次给根目录分配的空间过小,好像是20GB吧~结果编译Android的时候,编译了3个小时候直接中止掉了.郁闷.这个也告诉我们一定 ...

  6. C#基础(四)——ref与out的区别

    1.ref传进去的参数必须进行初始化,out不必int i;SomeMethod( ref i );//语法错误SomeMethod( out i );//通过 2.ref传进去的参数在函数内部可以直 ...

  7. 使用webstorm上传代码到github

    使用webstorm上传代码到github 字数681 阅读330 评论0 喜欢5 之前使用过webstorm上传代码到github,过了几个月竟然发现自己忘记了,好记性不如烂笔头啊,今天又重新用了一 ...

  8. 教了几天C语言 C语言竞赛------家长们你们为什么这么急!!

    由于工大某些传统,暑假放一个月,想想有很多事情要做,而且回去也是热着,倒不如不回家了,在哈尔滨正好避暑,又能轻轻松松的吧事情做了,暑假还能有个好的休息,这样想着,最终决定不回去了.其实不回去的话,就会 ...

  9. WPF中的一些常用类型转换

    1.string和Color的转换: //string转Color (Color)ColorConverter.ConvertFromString((string)str); //Color转stri ...

  10. 如何让listview列表为空时显示提示

    先在布局文件中声明一个TextView,再设置listview.setEmptyView(TextView).这样当listview中的数据为空时就会列表的位置就会显示textviw中的提示.