NOIP2007矩阵取数[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 提高第三题
-------------------------------------
DP
行与行之间相互独立,各行单独求解;一定先清空
f(i,j)左选了i个,右选了j个的最大得分
状态转移很好想,注意边界处理
高精度[这次从数组1开始]
高加高,高乘低
输出时一定小心0
建议先写出long long 的方便调试
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
const int B=1e4,L=; struct big{
int size,d[L];
big(int a=):size(a){memset(d,,sizeof(int)*L);}
}; void jia(big &a,big &b){
int g=,i;
for(i=;;i++){
if(g==&&i>a.size&&i>b.size) break;
int tmp=g;
if(i<=a.size) tmp+=a.d[i];
if(i<=b.size) tmp+=b.d[i];
a.d[i]=tmp%B;
g=tmp/B;
}
a.size=i-;
} void chengInt(big &a,int k){
int g=,i;
for(i=;i<=a.size;i++){
int tmp=a.d[i]*k;
a.d[i]=(tmp+g)%B;
g=(tmp+g)/B;
}
while(g){
a.d[++a.size]=g%B;
g/=B;
}
} void copy(big &t,big &s){
t.size=s.size;
for(int i=;i<=s.size;i++) t.d[i]=s.d[i];
} big max(big &a,big &b){
if(a.size>b.size) return a;
if(a.size<b.size) return b;
for(int i=a.size;i>=;i--){
if(a.d[i]>b.d[i]) return a;
if(a.d[i]<b.d[i]) return b;
}
return a;
} void print(big &a){
for(int i=a.size;i>=;i--){
if(i==a.size);
else if(a.d[i]<) cout<<"";
else if(a.d[i]<) cout<<"";
else if(a.d[i]<) cout<<"";
cout<<a.d[i];
}
cout<<"\n";
} int n,m;
int a[N][N];
big f[N][N];
big ans,fin=; big two[N];
void PRE(){
two[].d[]=;
for(int i=;i<=m+;i++){
copy(two[i],two[i-]);
chengInt(two[i],);
}
}
big sol(int num){
ans=big();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) f[i][j]=big(); f[][].d[]=a[num][]*;
f[][].d[]=a[num][m]*;
for(int i=;i<=m;i++){
// f[i][0]=f[i-1][0]+a[num][i]*((ll)1<<i);
// f[0][i]=f[0][i-1]+a[num][m-i+1]*((ll)1<<i); copy(f[i][],f[i-][]);
big tmp; copy(tmp,two[i]); chengInt(tmp,a[num][i]);
jia(f[i][],tmp); copy(f[][i],f[][i-]);
big tmp2; copy(tmp2,two[i]); chengInt(tmp2,a[num][m-i+]);
jia(f[][i],tmp2); }
for(int i=;i<=m;i++)
for(int j=;j<=m-i;j++){
// f[i][j]=max(f[i-1][j]+a[num][i]*((ll)1<<(i+j)),
// f[i][j-1]+a[num][m-j+1]*((ll)1<<(i+j))); big x,y;
copy(x,f[i-][j]);
big tmp; copy(tmp,two[i+j]); chengInt(tmp,a[num][i]);
jia(x,tmp); copy(y,f[i][j-]);
big tmp2; copy(tmp2,two[i+j]); chengInt(tmp2,a[num][m-j+]);
jia(y,tmp2); f[i][j]=max(x,y);
} for(int i=;i<=m;i++) ans=max(ans,f[i][m-i]);
return ans;
} int main(){//system("pause");
cin>>n>>m;
PRE();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j]; for(int i=;i<=n;i++) {big tmp=sol(i);jia(fin,tmp);}
print(fin); }
NOIP2007矩阵取数[DP|高精度]的更多相关文章
- [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度
https://www.luogu.org/problem/show?pid=1005 dp好想,高精度练手题,有点不舒服的是前后取数位置的计算,代码量太少才会写题这么慢,noip之前虽然重点放在 ...
- TYVJ 矩阵取数 Label:高精度+dp
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
- NOIP2007 矩阵取数游戏(区间DP)
传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? ...
- [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 ...
- [LuoguP1005]矩阵取数游戏 (DP+高精度)
题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...
随机推荐
- .net c# 视频剪切抓取缩略图
public string Cut(string ffmpegPath, string videoPath, string savePath, string imgSize, int sleepTim ...
- php随机生成指定长度的字符串 可以固定数字 字母 混合
php 生成随机字符串 可以指定是纯数字 还是纯字母 或者混合的. 可以指定长度的. function rand_zifu($what,$number){ $string=''; for($i = 1 ...
- Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
目录 简介和安装 测试MySQL 认识一下Connection Options MYSQL CURD 插入 更新 查询 删除 Nodejs 调用带out参数的存储过程,并得到out参数返回值 结束数据 ...
- Troubleshooting FIM: (No Display Name) in FIM Portal
from: http://social.technet.microsoft.com/wiki/contents/articles/12682.troubleshooting-fim-no-displa ...
- JavaScript学习02 基础语法
JavaScript学习02 基础语法 JavaScript中很多基础内容和Java中大体上基本一样,所以不需要再单独重复讲了,包括: 各种算术运算符.比较运算符.逻辑运算符: if else语句.s ...
- android https正确调用方案(防中间人劫持)
以下内容为原创,欢迎转载,转载请注明 来自博客园:http://www.cnblogs.com/joey-hua/p/4971380.html 1.劫持https接口 很多android客户端虽然使用 ...
- ios8版本地图定位注意点
学习ios地图定位 我先定义一个属性: @property (weak, nonatomic) IBOutlet MKMapView *mapV; 然后在项目运行时初始化该属性一些参数: //设置地图 ...
- Android 采用post方式提交数据到服务器
接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ...
- PagerTabStrip在ViewPager的页面中添加标题显示
package com.qf.day18_viewpager_demo_05; import java.util.ArrayList; import java.util.List; import an ...
- WCF学习资料汇总
微软官方讲解教程: 跟我一起从零开始学WCF系列课程 http://msdnwebcast.net/webcast/1/2692/ 构建WCF面向服务的应用程序系列课程 http://msdnwebc ...