【每日一题】矩阵取数游戏
矩阵取数游戏
https://ac.nowcoder.com/acm/problem/16645
题意:
思路:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int M = 1005; const int N = 85; __int128 read(){ __int128 x=0,f=1; char ch=getchar(); while(!isdigit(ch)&&ch!='-')ch=getchar(); if(ch=='-')f=-1; while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; } void print(__int128 x){ if(x<0)putchar('-'),x=-x; if(x>9)print(x/10); putchar(x%10+'0'); } int n,m; __int128 f[M][M],g[M],a[M]; void init(){ g[0] = 1; for(int i = 1;i <= m;i++){ g[i] = g[i - 1] * 2; } } int main(){ scanf("%d%d",&n,&m); init(); __int128 ans = 0; for(int i = 1;i <= n;i++){ memset(f,0,sizeof(f)); for(int j = 1;j <= m;j++){ a[j] = read(); } for(int len = m;len >= 1;len--){ for(int i = 1;i+len-1 <= m;i++){ int j = i + len - 1; f[i][j] = max(f[i][j], f[i - 1][j] + g[m - j + i - 1] * a[i - 1]); f[i][j] = max(f[i][j], f[i][j + 1] + g[m - j + i - 1] * a[j + 1]); } } __int128 mx = 0; for(int i = 1;i <= m;i++){ mx = max(mx,f[i][i] + g[m] * a[i]); } ans = ans + mx; } print(ans); return 0; }
每日一题 文章被收录于专栏
每题一题题目