题目大意

  一个矩阵,每次从每一行的行首或行尾取一个数,每一行的价值为 取的数*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;
}

  

最新文章

  1. SecureCRT上传和下载文件
  2. linux 用户创建、管理、权限分配
  3. 安装MySql for Visual Studio后,打开IDE找不到MySql选项
  4. assign() 方法
  5. iOS开发——打包ipa
  6. 关于redhat6的服务说明
  7. crontab与环境变量
  8. 让c#的exe只要被修改就无法运行,支持混淆和数字证书
  9. (转载)Android出现“Read-only file system”解决办法
  10. start tomcat with debugging mode
  11. 4、初识python
  12. YARN的三种调度器的使用
  13. springmvc+thymeleaf搭建框架启动报错
  14. Java GC机制
  15. 【分布式搜索引擎】Elasticsearch中的基本概念
  16. 【原】Spring AOP实现对Redis的缓存同步
  17. python对象池模式
  18. python函数的动态传参.作用域与命名空间
  19. 使用Axure RP原型设计实践07,注册判断
  20. My blog in AI ---神经网络,神经元(neural network,nervecell)

热门文章

  1. 文件下载之ServletOutputStream
  2. python_文件io
  3. 文艺平衡树(区间翻转)(Splay模板)
  4. 批量obj格式直接转gltf
  5. 戴尔14G服务器用H740P配置阵列
  6. Java切换JDK版本的方法及技巧
  7. Sprinboot优雅配置监听,并记录所有启动事件
  8. 使用Oracle函数在创建表的时候自动加入生成的流水号 生成格式是:前缀+年月日+00000
  9. 从0开始复习JS---1、函数复习
  10. PHP面试:说下什么是堆和堆排序?