luogu1005矩陣取數遊戲題解--區間DP
阿新 • • 發佈:2018-09-14
max == turn org ons 區間 getchar https lin
題目鏈接
https://www.luogu.org/problemnew/show/P1005
分析
忽然發現這篇題解好像並沒有什麽意義。。。因為跟奶牛零食那道題一模一樣,博主比較懶如果您想看題解的話去區間DP標簽中找奶牛零食那道題吧,實在抱歉。。。
話說NOIP喜歡考奶牛題啊(e.g. NOIP2017 D1T1),USACO刷完是不是就能阿克了呀
代碼沒寫高精用__int128代替,話說什麽時候補個高精的坑(flag)
代碼
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <cctype> #include <queue> #define ll __int128 #define ri register int using std::min; using std::max; template <class T>inline void read(T &x){ x=0;int ne=0;char c; while(!isdigit(c=getchar()))ne=c==‘-‘; x=c-48; while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+c-48; x=ne?-x:x;return ; } const int maxn=83; const ll inf=1e25; ll fac[maxn]; int n,m; ll f[maxn][maxn][maxn],g[maxn][maxn]; void print(ll x){ if(!x) return; if(x) print(x/10); putchar(x%10+‘0‘); } int main(){ fac[0]=1; for(ri i=1;i<=80;i++)fac[i]=fac[i-1]*2; read(n),read(m); for(ri i=1;i<=n;i++){ for(ri j=1;j<=m;j++){ read(g[i][j]); f[i][j][j]=g[i][j]*fac[m]; } } int l,r; for(ri p=1;p<=n;p++){ for(ri len=2;len<=m;len++){ for(l=1;l<=m-len+1;l++){ r=l+len-1; f[p][l][r]=max(f[p][l+1][r]+g[p][l]*fac[m-len+1],f[p][l][r-1]+g[p][r]*fac[m-len+1]); } } } ll ans=0; for(ri i=1;i<=n;i++)ans+=f[i][1][m]; if(!ans)puts("0"); else print(ans); puts(""); return 0; }
luogu1005矩陣取數遊戲題解--區間DP