矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45
题目链接: NOIP 2007 矩阵取数游戏(Codevs)
题目大意:
给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数
解法:
动态规划
DP[i][j]表示当前行i位置到j位置获得的最大分数
转移方程:
DP[i][j]=max(DP[i+1][j]+a[i]*2^x,DP[i][j-1]+a[i]*2^x);
需要注意的地方:
1.M和N给的范围略坑啊,2^80只有悄悄不说话了,所以直接上了100000的压位,感觉比高精好使多了
2.2的次方多次用到,所以预先处理出来待用
//矩阵取数游戏 (NOIP2007)
//动态规划 高精度
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=;
const int maxm=;
const int maxl=;
int N,M;
int a[maxn];
int DP[maxn][maxm][maxl];
int ys[maxn][maxl];
int ans[maxl];
int tmp[maxl];
void Multi(int *x,int *y,int z)
{
memset(tmp,,sizeof(tmp));
tmp[]=y[];
for(int i=;i<=tmp[];i++)
{
tmp[i]=y[i]*z;
}
for(int i=;i<=tmp[];i++)
{
tmp[i+]+=tmp[i]/;
tmp[i]%=;
}
while(tmp[tmp[]+])
{
tmp[]++;
tmp[tmp[]+]+=tmp[tmp[]]/;
tmp[tmp[]]%=;
}
for(int i=;i<;i++)x[i]=tmp[i];
return ;
}
void Add(int *x,int *y,int *z)
{
memset(tmp,,sizeof(tmp));
if(y[]>z[])tmp[]=y[];
else tmp[]=z[];
for(int i=;i<=tmp[];i++)
{
tmp[i]=y[i]+z[i];
}
for(int i=;i<=tmp[];i++)
{
tmp[i+]+=tmp[i]/;
tmp[i]%=;
}
if(tmp[tmp[]+])tmp[]++;
for(int i=;i<;i++)x[i]=tmp[i];
return ;
}
bool Max(int *x,int *y)
{
if(x[]>y[])return ;
else if(y[]>x[])return ;
else
{
for(int i=x[];i>=;i--)
{
if(x[i]>y[i])return ;
else if(x[i]<y[i])return ;
}
}
return ;
}
int main()
{
scanf("%d %d",&N,&M);
ys[][]=;
ys[][]=;
for(int i=;i<=M;i++)
{
Multi(ys[i],ys[i-],);
}
ans[]=;ans[]=;
for(int i=;i<=N;i++)
{
for(int j=;j<=M;j++)
{
scanf("%d",&a[j]);
Multi(DP[j][j],ys[M],a[j]);
}
for(int k=;k<=M;k++)
{
for(int x=;x<=M-k+;x++)
{
int y=x+k-;
int xm[],ym[],cm[];
Multi(cm,ys[M-k+],a[x]);
Add(xm,cm,DP[x+][y]);
Multi(cm,ys[M-k+],a[y]);
Add(ym,cm,DP[x][y-]);
if(Max(xm,ym))
{
memcpy(DP[x][y],xm,sizeof(int)*);
}
else
{
memcpy(DP[x][y],ym,sizeof(int)*);
}
}
}
Add(ans,ans,DP[][M]);
}
printf("%d",ans[ans[]]);
for(int i=ans[]-;i>=;i--)
{
printf("%05d",ans[i]);
}
printf("\n");
return ;
}
矩阵取数游戏 NOIP 2007的更多相关文章
- 矩阵取数游戏 2007年NOIP全国联赛提高组(dp+高精)
矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description [问题描述]帅帅经常跟 ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- 洛谷 P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 矩阵取数游戏洛谷p1005
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 洛谷P1005 矩阵取数游戏
P1005 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次 ...
- [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
随机推荐
- uva 567
Floyd 算法 就输入麻烦点 #include <iostream> #include <cstring> #include <cstdlib> #inclu ...
- ActivePython2.7 +Firefly1.2.2+WIN7服务器搭建过程(已通过)
原地址:http://www.9miao.com/question-15-54027.html 1.ActivePython2.7 版本(内部已经包含easy_install,pywin32)2.所需 ...
- Nginx、LVS及HAProxy负载均衡软件的优缺点详解
http://www.csdn.net/article/2014-07-24/2820837
- linux动态库默认搜索路径设置的三种方法
众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两 ...
- PRMonitor,学习SSDT HOOK的好例子,学习的内核HOOK的好例子(注意右边有一堆类似的例子)
http://download.csdn.net/detail/bolong5240/1060645
- std::advance 给迭代器增加指定偏移量
template <class InputIterator, class Distance> void advance (InputIterator& it, Distance n ...
- SRM 586 DIV1 L1
可以化简为求n条线段的最大覆盖问题,需要注意的是对于实数而言. #include <iostream> #include <vector> #include <strin ...
- Cobalt Strike
http://www.77169.com/hack/201512/222080.shtm
- window.addEventListener来解决让一个js事件执行多个函数
可能你也碰到过这种情况,就是在js的代码中用了window.onload后,可能会影响到body中的onload事件.这时就要用window.attachEvent和window.addEventLi ...
- Android开发之MediaPlayer和SurfaceView组成视频播放器
SurfaceView 使用双缓冲技术 是个重量级的组件 只要不可见,就不会创建,可见时,才会创建 只要不可见,就会销毁 SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...