洛谷 P1005 矩阵取数游戏
来源:互联网 发布:生辰八字高分起名软件 编辑:程序博客网 时间:2024/06/05 09:53
题目描述
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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行,为一个整数,即输入矩阵取数后的最大得分。
输入输出样例
输入样例#1:
2 3
1 2 3
3 4 2
输出样例#1:
82
说明
NOIP 2007 提高第三题
分析:
对于每一行,其实都是独立的,也就是每一行的最优值之和即为答案。设f[i,j]为某一行第i个数字到第j个数字的最大值,有
f[i,j]=max(f[i+1,j]+a[i]*2^m,f[i,j-1]+a[j]*2^m) (m为取到第m次)
代码:
type st=array[0..30] of longint;var ans:st;f:array[1..80,1..80] of st;a:array[1..80] of longint;m,n:longint;procedure add(var x:st;y,z:st);var temp,i:longint;begin temp:=0; if y[0]>z[0] then x[0]:=y[0] else x[0]:=z[0]; for i:=1 to x[0] do begin temp:=y[i]+z[i]+temp; x[i]:=temp mod 10000; temp:=temp div 10000; end; if temp>0 then begin inc(x[0]); x[x[0]]:=temp;end;end;procedure mul(var x:st);var temp,i:longint;begin temp:=0; for i:=1 to x[0] do begin temp:=x[i]*2+temp; x[i]:=temp mod 10000; temp:=temp div 10000; end; while temp>0 do begin inc(x[0]);x[x[0]]:=temp mod 10000;temp:=temp div 10000;end;end;procedure plus(var x:st;y:st;z:longint);var i:longint;begin x:=y;inc(x[1],z);i:=1; while x[i]>=10000 do begin x[i+1]:=x[i] div 10000+x[i+1]; x[i]:=x[i] mod 10000; inc(i); if x[0]<i then x[0]:=i; end;end;function compare(a,b:st):boolean;var i:longint;begin if a[0]>b[0] then exit(true); if a[0]<b[0] then exit(false); for i:=a[0] downto 1 do if a[i]>b[i] then exit(true) else if a[i]<b[i] then exit(false); exit(false);end;procedure dp;var i,j:longint;max,min:st;begin fillchar(f,sizeof(f),0); for i:=1 to m do begin f[i,i][0]:=1;f[i,i][1]:=a[i]*2;end; for i:=m-1 downto 1 do for j:=i+1 to m do begin plus(max,f[i+1,j],a[i]); mul(max); plus(min,f[i,j-1],a[j]); mul(min); if compare(min,max) then max:=min; f[i,j]:=max; end; add(ans,ans,f[1,m]);end;procedure re;var i,j:longint;begin readln(n,m); for i:=1 to n do begin for j:=1 to m do read(a[j]); readln; dp; end; end;procedure print;var i:longint;begin write(ans[ans[0]]); for i:=ans[0]-1 downto 1 do begin write(ans[i] div 1000 mod 10); write(ans[i] div 100 mod 10); write(ans[i] div 10 mod 10); write(ans[i] mod 10); end;end;begin re;print;end.
0 0
- 洛谷 P1005 矩阵取数游戏
- 洛谷 P1005 矩阵取数游戏
- 洛谷P1005&NOIP2007 矩阵取数游戏
- 洛谷 P1005 矩阵取数游戏
- 洛谷P1005 矩阵取数游戏
- 洛谷p1005矩阵取数游戏
- P1005 矩阵取数游戏
- P1005 矩阵取数游戏
- P1005 矩阵取数游戏
- P1005矩阵取数
- 洛谷 P1005 Tyvj P1054 [NOIP2007 T3] 矩阵取数游戏 [60分 非高精]
- 矩阵取数游戏
- 矩阵取数游戏
- 矩阵取数游戏
- 矩阵取数游戏
- 矩阵取数游戏
- 【NOIP2007】洛谷1005 矩阵取数游戏
- codevs1166 矩阵取数游戏
- Java中ByteBuffer
- codeforce118A String Task
- 常用的时间工具类
- uva1486 Transportation
- CentoOS7 上安装MySQL 5.7
- 洛谷 P1005 矩阵取数游戏
- 【Unity】中如何通过GPS获取设备经纬度(测试脚本)
- mysql数据库数字格式化和日期时间格式化
- JS 倒计时
- Allegro中如何导入DXF文件
- QT中*.pro文件的写法介绍
- AS 下载/安装/简单使用/创建模拟器
- MSP430F1612 TimerA 定时功能配置
- SPOJ Thor vs Frost Giants 数论