题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×mn \times mn×m的矩阵,矩阵中的每个元素ai,ja_{i,j}ai,j​均为非负整数。游戏规则如下:

  1. 每次取数时须从每行各取走一个元素,共nnn个。经过mmm次后取完矩阵内所有元素;
  2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
  3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值×2i\times 2^i×2i,其中iii表示第iii次取数(从111开始编号);
  4. 游戏结束总得分为mmm次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

输入输出格式

输入格式:

输入文件包括n+1n+1n+1行:

第111行为两个用空格隔开的整数nnn和mmm。

第2∽n+12\backsim n+12∽n+1行为n×mn \times mn×m矩阵,其中每行有mmm个用单个空格隔开的非负整数。

输出格式:

输出文件仅包含111行,为一个整数,即输入矩阵取数后的最大得分。

输入输出样例

输入样例#1: 复制

2 3
1 2 3
3 4 2
输出样例#1: 复制

82

说明

NOIP 2007 提高第三题

数据范围:

60%的数据满足:1≤n,m≤301\le n, m \le 301≤n,m≤30,答案不超过101610^{16}1016
100%的数据满足:1≤n,m≤801\le n, m \le 801≤n,m≤80,0≤ai,j≤10000 \le a_{i,j} \le 10000≤ai,j​≤1000

分析:这道题主要是用来练习dp ,没有涉及高精的问题,因此代码是不能AC的,但是也学习了一下dp的思想,在洛谷上能够过六个点。。。

我们用dp[i][j]代表区间变为【i,j】时,获得的最大分数当区间变为[i][j]时,一定是由【i-1,j】或者是[i,j-1]这两个符合条件的方程式中转移过来的,在第m-(j-i)-1次i取走了当前值。。。

因此状态转移方程就是 dp[i][j]=max(dp[i-1][j]+a[t][i-1]*mypow(len),dp[i][j+1]+a[t][j+1]*mypow(len));

在这要注意一下,当区间长度为1时,它是没有办法把最后一个数字取出来的。因此在这里要在重新加上。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ll unsigned long long
const int maxn = ;
ll mypow(int k){
ll sum=;
for(int i=; i<=k; i++ ){
sum*=;
}
return sum;
} int n,m;
ll ans=; int main(){
cin>>n>>m;
int a[maxn][maxn];
memset(a,,sizeof(a));
ll dp[maxn][maxn];
for( int i=; i<=n; i++ ){
for( int j=; j<=m; j++ ){
scanf("%d",&a[i][j]);
}
}
int t=; while(t++<n){
memset(dp,,sizeof(dp));
for( int i=; i<=m; i++ ){
for( int j=m; j>=i; j-- ){
int len =m-(j-i)-; }
}
// for( int i=1; i<=m; i++ ){
// for( int j=1; j<=m; j++ ){
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
ll rev=;
int i;
for( i=; i<=m; i++ ){
ll r=dp[i][i]+a[t][i]*mypow(m);
if(r>rev) rev=r;
}
// cout<<"rev="<<rev<<endl;
ans+=rev;
}
cout<<ans<<endl;
return ;
}

最新文章

  1. 机器学习caffe环境搭建——redhat7.1和caffe的python接口编译
  2. ASP.NET Web API 接口执行时间监控
  3. Spring入门一
  4. 虚拟键盘,移动web开发的痛
  5. Jenkins安装与配置
  6. Python学习笔记(十一)
  7. SpringMVC处理multipart请求.
  8. 解决前端开发sublime text 3编辑器无法安装插件的问题
  9. Google Chrome即将开始警告—停止支持Flash Player
  10. 两小时入门Docker
  11. 我的es6笔记
  12. zabbix3.2添加web页面监控(Web monitoring)
  13. 2017年蓝桥杯省赛A组c++第5题(递归算法填空)
  14. (17)Questioning the universe
  15. 20145127《java程序设计》第七周学习总结
  16. qi zi
  17. (转)c指针问题
  18. maven中的pom.xml解析
  19. 微信小程序踩坑记
  20. Android 解决Android的TextView和EditText换行问题

热门文章

  1. golang time打印出的值是62135596800的来源
  2. Android、iOS、和Web如何做灰度发布?
  3. jquery监测文本框变化
  4. SpringBoot之整合Redis分析和实现-基于Spring Boot2.0.2版本
  5. 运行Keras版本的Faster R-CNN(1)
  6. golang编译库文件方式
  7. TCP连接数过多问题
  8. doctest --- 一个改善python代码质量的工具
  9. 使用git和github进行协同开发流程
  10. android: android 中的ColorMatrix (转)