题目大意

  一个矩阵,每次从每一行的行首或行尾取一个数,每一行的价值为 取的数*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 矩阵取数游戏的更多相关文章

  1. luogu1005矩阵取数游戏题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...

  2. NOIP2007 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  3. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

  4. 矩阵取数游戏 NOIP 2007

    2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...

  5. 洛谷 P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  6. codevs1166 矩阵取数游戏

    题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个 ...

  7. 矩阵取数游戏洛谷p1005

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  8. P1005 矩阵取数游戏 区间dp 高精度

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...

  9. AC日记——矩阵取数游戏 洛谷 P1005

    矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struc ...

随机推荐

  1. Android开发笔记(8)——调用子Activity

     转载请注明:http://www.cnblogs.com/igoslly/p/6853730.html  调用子Activity 需要子Activity返回值 MainActivity使用start ...

  2. Android基础TOP4_1:点击物理按钮弹出退出提示框

    JAVA: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedIns ...

  3. (转)Hibernate的配置详解

    http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...

  4. HDU_4826_dp

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. mysql_数据查询_嵌套查询

    嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块. 嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询. 注:子查询的SELECT语句中不能使 ...

  6. Java对象的创建及使用

    Java对象的创建及使用 对象是类的具体实例(instance),是真实存在的个体:

  7. 云计算时代,你为什么一定要学Linux?

    云计算早已不是什么稀奇的概念,它的火爆让Linux运维工程师这个职业越来越重要.在当今各类云平台提供的系统中,Linux系统几乎毫无争议的独占鳌头,市场份额进一步扩张. 这也让Linux运维工程师职位 ...

  8. 16.copy_to定制组合field解决cross-fields搜索弊端

    主要知识点: 在index的mapping中加copy_to字段的方法 copy_to搜索方法     用most_fields策略,去实现cross-fields搜索,有3大弊端,为了解决这三个弊端 ...

  9. 51nod1103 N的倍数

    [题解] 先预处理出模N意义下的前缀和sum[i]. 1.如果sum[i]=0,那么1~i的数之和就是N的倍数 2.sum[i]%N总共有0~N-1这N种情况:根据1,如果sum[i]为0则必定有解: ...

  10. js实现滚动条下拉到一定程度固定结算栏

    实现效果如下: js代码实现如下: var a = $("body").height(); var b = $(window).height(); var c = a - b - ...