[NOIP2007]矩阵取数游戏
题目描述
题解
简单DP+毒瘤高精
显然行与行没有关联
所以只需要每行处理
考虑DP i,j,k 表示第I次取数,第J行,有K次取的头的最大分数
直接DP即可
#include<bits/stdc++.h> using namespace std; #define LL __int128 inline int read() { int f=1,x=0; char ch; do { ch=getchar(); if(ch=='-') f=-1; }while(ch<'0'||ch>'9'); do { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); }while(ch>='0'&&ch<='9'); return f*x; } inline LL Pow(LL a,LL b) { LL ans=1,mul=a; while(b) { if(b&1) ans*=mul; mul*=mul; b>>=1; } return ans; } int n,m; int a[100 + 10][100 + 10]; LL dp[100 + 10][100 + 10][100 + 10]; LL ans=0; inline void print(LL x) { if(!x) return; if(x) print(x/10); putchar(x%10+'0'); } int main() { n=read();m=read(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { a[i][j]=read(); } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { for(int k=0;k<=i;k++) { if(k!=0) dp[i][j][k]=max(dp[i-1][j][k-1]+a[j][k]*Pow(2,i),dp[i-1][j][k]+a[j][m-(i-k)+1]*Pow(2,i)); else dp[i][j][k]=dp[i-1][j][k]+a[j][m-(i-k)+1]*Pow(2,i); } } } for(int j=1;j<=n;j++) { LL maxi=0; for(int k=0;k<=m;k++) { maxi=max(dp[m][j][k],maxi); // cout<<dp[m][j][k]<<" "; } // cout<<endl; ans+=maxi; } if(!ans) { cout<<0<<endl; } else { print(ans); } } /* 2 3 1 2 3 3 4 2 */