TYVJ 矩阵取数 Label:高精度+dp
题目描述
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:
1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;
2.每次取走的各个元素只能是该元素所在行的行首或行尾;
3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);
4.游戏结束总得分为m次取数得分之和。
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。
输入输出格式
输入格式:
输入文件game.in包括n+1行:
第1行为两个用空格隔开的整数n和m。
第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。
数据范围:
60%的数据满足:1<=n, m<=30,答案不超过10^16
100%的数据满足:1<=n, m<=80,0<=aij<=1000
输出格式:
输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大得分。
输入输出样例
- 2 3
- 1 2 3
- 3 4 2
- 82
说明
NOIP 2007 提高第三题
代码
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define maxn 100
- using namespace std;
- struct bigint{
- int a[maxn];//a[0]存位数
- bigint(){memset(a,,sizeof(a));}
- bigint& operator=(const string s){//字符串类的赋值
- int k=;
- for(int i=s.size()-;i>=;i--){
- k++;
- this->a[k]=s[i]-'';
- }
- a[]=s.size();
- return *this;
- }
- bigint& operator=(const int s){
- int num=s,i=;
- while(num){
- i++;
- this->a[i]=num%;
- num/=;
- }
- this->a[]=i;
- return *this;
- }
- /* bigint& operator=(const bigint &s){
- memset(a,0,sizeof(a));
- this->a[0]=s.a[0];
- for(int i=1;i<=s.a[0];i++){
- this->a[i]=s.a[i];
- }
- return *this;
- }*/
- //赋值部分结束
- //运算符+
- bigint operator +(const bigint b){
- bigint c;
- c.a[]=max(a[],b.a[]);
- for(int i=;i<=c.a[];i++){
- c.a[i]+=(a[i]+b.a[i]);
- c.a[i+]+=c.a[i]/;
- c.a[i]%=;
- }
- if(c.a[c.a[]+]>)
- c.a[]++;
- return c;
- }
- //比较
- /*bool operator <(const bigint b){
- if((this->a[0])!=b.a[0]) return (this->a[0])<b.a[0];
- for(int i=b.a[0];i>=1;i--){
- if((this->a[0])!=b.a[i])
- return (this->a[i])<b.a[i];
- }
- return false;
- }*/
- bool operator <(const bigint b){
- if(this->a[]<b.a[])
- return true;
- if(this->a[]>b.a[])
- return false;
- for(int i=b.a[];i>=;i--){
- if(this->a[i]!=b.a[i])
- return this->a[i]<b.a[i];
- }
- return false;
- }
- bool operator >(bigint b){//不可写const,会报错
- return b<(*this);
- }
- };
- ostream& operator<<(ostream&out,const bigint a){
- for(int i=a.a[];i>=;i--)
- out<<a.a[i];
- return out;
- }
- istream& operator>>(istream&in,bigint& a){//不可写const
- string s;
- in>>s;
- a=s;
- return in;
- }
- int main(){
- int n,m;
- cin>>m>>n;
- bigint a[];
- bigint tot,f[maxn][maxn];
- bigint q,p;
- for(int num=;num<=m;num++){
- for(int i=;i<=n;i++)
- cin>>a[i];
- for(int i=;i<=n;i++)//预处理
- f[i][i]=a[i]+a[i];
- for(int l=;l<n;l++){
- for(int i=;i<=n&&i+l<=n;i++){
- int j=i+l;
- p=a[i]+f[i+][j];
- q=a[j]+f[i][j-];
- if(p<q)
- f[i][j]=q+q;
- else
- f[i][j]=p+p;
- }
- }
- tot=f[][n]+tot;
- memset(&a,,sizeof(a));//注意&
- memset(&f,,sizeof(f));
- memset(&q,,sizeof(q));
- memset(&p,,sizeof(p));
- }
- cout<<tot<<endl;
- return ;
- }
注释部分比较函数不可用,待查
就是一个struct版的高精度,抄自http://www.luogu.org/problem/lists
TYVJ 矩阵取数 Label:高精度+dp的更多相关文章
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 矩阵取数问题(dp,高精)
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×mn \times mn×m的矩阵,矩阵中的每个元素ai,ja_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走 ...
- P1005 矩阵取数游戏[区间dp]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...
- [luoguP1005] 矩阵取数游戏(DP + 高精度)
传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...
- TYVJ P1078 删数 Label:区间dp
描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...
- NOIP2007矩阵取数[DP|高精度]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- [LuoguP1005]矩阵取数游戏 (DP+高精度)
题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
随机推荐
- 双操作系统Grub 引导修护
,只要进入ubuntu :sudo update-grub 就行了! 它会自动给Grub添加NTFS模块,以支持NTFS下的文件读取 转自: http://zhidao.baidu.com/link? ...
- Spring面试题集
一.Spring简介 * Spring框架有哪几部分组成? Spring框架有七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,主要功能表现如下: ...
- 【转】打造属于自己的Android Studio神器
本文转载自:http://www.stormzhang.com/android/2015/05/26/android-tools/,并加以修改.黄色底部分是本人添加的内容. 一晃好久没更新博客了,最近 ...
- iOS 图片拉伸的解释
以前对于ios的图片拉伸参数一直不太理解,终于看到一篇好文章,转载一下,原文地址:http://blog.csdn.net/q199109106q/article/details/8615661 主要 ...
- 现在, Delphi 的多线程已经非常易用了!
先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): {自定义方法: 在窗体上绘制...} procedure MyMethod; var i: Integer; begin ...
- MongoDB副本集学习(二):基本测试与应用
简单副本集测试 这一节主要对上一节搭建的副本集做一些简单的测试. 我们首先进入primary节点(37017),并向test.test集合里插入10W条数据: . rs0:PRIMARY> ;i ...
- Java for LeetCode 164 Maximum Gap
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- 【JAVA、C++】LeetCode 005 Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- Ubuntu 13.04安装搜狗输入法
Ubuntu 13.04安装搜狗输入法 [日期:2013-07-08] 来源:Linux公社 作者:LinuxIDC.com [字体:大 中 小] 目标:在Ubuntu 13.04以及基于U ...
- UVALive 7269 Snake Carpet (构造)
题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...