luogu1005 矩阵取数游戏
题目大意
一个矩阵,每次从每一行的行首或行尾取一个数,每一行的价值为 取的数*2^当前取数的次数,每一次的价值为每一行的价值的和。求得到的价值的最大值。
思路

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_ROW = 100, MAX_COL = 100;
int A[MAX_ROW][MAX_COL];
int TotRow, TotCol; struct BigInt
{
private:
static const int MAX_N = 100, BASE = 10000, CARRY = 4;
int A[MAX_N];
int Len; public:
void Print()
{
printf("%d", A[Len]);
for (int i = Len - 1; i >= 0; i--)
printf("%0*d", CARRY, A[i]);
printf("\n");
} void Clear()
{
memset(A, 0, sizeof(A));
Len = 0;
} void Set(int x)
{
Clear();
while (x)
{
A[Len++] = x % BASE;
x /= BASE;
}
while (Len > 0 && A[Len] == 0)
Len--;
} BigInt(int x)
{
Set(x);
} BigInt()
{
Set(0);
} BigInt operator =(const BigInt& a)
{
memcpy(A, a.A, sizeof(A));
Len = a.Len;
return *this;
} BigInt operator *=(const BigInt& a)
{
BigInt b = *this;
Clear();
Len = a.Len + b.Len;
for (int i = 0; i <= a.Len; i++)
for (int j = 0; j <= b.Len; j++)
{
A[i + j] += a.A[i] * b.A[j];
A[i + j + 1] += A[i + j] / BASE;
A[i + j] %= BASE;
}
if (A[Len + 1])
Len++;
return *this;
} BigInt operator *(const BigInt& a)
{
BigInt ans = *this;
ans *= a;
return ans;
} BigInt operator +=(const BigInt& a)
{
Len = max(Len, a.Len);
for (int i = 0; i <= Len; i++)
{
A[i] += a.A[i];
A[i + 1] += A[i] / BASE;
A[i] %= BASE;
}
if (A[Len + 1])
Len++;
return *this;
} BigInt operator +(const BigInt& a)
{
BigInt ans = *this;
ans += a;
return ans;
} bool operator <(const BigInt& a) const
{
if (Len != a.Len)
return Len < a.Len;
for (int i = Len; i >= 0; i--)
if (A[i] != a.A[i])
return A[i] < a.A[i];
return true;
} bool Is0()
{
return Len == 0 && A[Len] == 0;
}
}F[MAX_COL][MAX_COL], Pow2[MAX_COL];
bool Vis[MAX_COL][MAX_COL]; void InitPow2(int n)
{
Pow2[0] = 1;
for (int i = 1; i <= n; i++)
Pow2[i] = Pow2[i - 1] * 2;
} BigInt Dfs(int row, int l, int r)
{
if (l > r)
return 0;
if (Vis[l][r])
return F[l][r];
Vis[l][r] = true;
BigInt a = Dfs(row, l + 1, r) + Pow2[TotCol - r + l] * A[row][l];
BigInt b = Dfs(row, l, r - 1) + Pow2[TotCol - r + l] * A[row][r];
return F[l][r] = a < b ? b : a;
} BigInt CalRow(int row)
{
memset(Vis, false, sizeof(Vis));
return Dfs(row, 1, TotCol);
} int main()
{
scanf("%d%d", &TotRow, &TotCol);
InitPow2(TotCol);
for (int i = 1; i <= TotRow; i++)
for (int j = 1; j <= TotCol; j++)
scanf("%d", &A[i][j]);
static BigInt ans(0);
for (int row = 1; row <= TotRow; row++)
ans += CalRow(row);
ans.Print();
return 0;
}
luogu1005 矩阵取数游戏的更多相关文章
- luogu1005矩阵取数游戏题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- 矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...
- 洛谷 P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- codevs1166 矩阵取数游戏
题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个 ...
- 矩阵取数游戏洛谷p1005
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- AC日记——矩阵取数游戏 洛谷 P1005
矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struc ...
随机推荐
- Android开发笔记(8)——调用子Activity
转载请注明:http://www.cnblogs.com/igoslly/p/6853730.html 调用子Activity 需要子Activity返回值 MainActivity使用start ...
- Android基础TOP4_1:点击物理按钮弹出退出提示框
JAVA: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedIns ...
- (转)Hibernate的配置详解
http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...
- HDU_4826_dp
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- mysql_数据查询_嵌套查询
嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块. 嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询. 注:子查询的SELECT语句中不能使 ...
- Java对象的创建及使用
Java对象的创建及使用 对象是类的具体实例(instance),是真实存在的个体:
- 云计算时代,你为什么一定要学Linux?
云计算早已不是什么稀奇的概念,它的火爆让Linux运维工程师这个职业越来越重要.在当今各类云平台提供的系统中,Linux系统几乎毫无争议的独占鳌头,市场份额进一步扩张. 这也让Linux运维工程师职位 ...
- 16.copy_to定制组合field解决cross-fields搜索弊端
主要知识点: 在index的mapping中加copy_to字段的方法 copy_to搜索方法 用most_fields策略,去实现cross-fields搜索,有3大弊端,为了解决这三个弊端 ...
- 51nod1103 N的倍数
[题解] 先预处理出模N意义下的前缀和sum[i]. 1.如果sum[i]=0,那么1~i的数之和就是N的倍数 2.sum[i]%N总共有0~N-1这N种情况:根据1,如果sum[i]为0则必定有解: ...
- js实现滚动条下拉到一定程度固定结算栏
实现效果如下: js代码实现如下: var a = $("body").height(); var b = $(window).height(); var c = a - b - ...