zoukankan      html  css  js  c++  java
  • P1005-矩阵取数游戏

      1 #include <bits/stdc++.h>
      2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
      3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
      4 #define INF 0x3f3f3f3f
      5 typedef long long ll;
      6 using namespace std;
      7 inline ll read()
      8 {
      9     ll ans = 0;
     10     char ch = getchar(), last = ' ';
     11     while(!isdigit(ch)) last = ch, ch = getchar();
     12     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
     13     if(last == '-') ans = -ans;
     14     return ans;
     15 }
     16 inline void write(ll x)
     17 {
     18     if(x < 0) x = -x, putchar('-');
     19     if(x >= 10) write(x / 10);
     20     putchar(x % 10 + '0');
     21 }
     22 const int maxn = 50;
     23 class HP
     24 {
     25     public : int len,s[maxn]; HP() {(*this) = 0;};
     26     HP(int inte) {(*this)=inte;}; HP(const char*str) {(*this)=str;};
     27     friend ostream& operator << (ostream &cout,const HP &x);
     28     HP operator = (int inte); HP operator = (const char*str);
     29     HP operator * (const HP &b);HP operator + (const HP &b);
     30     HP operator - (const HP &b);HP operator / (const HP &b);
     31     HP operator % (const HP &b);int Compare(const HP &b);
     32     bool operator < (const HP &b);
     33 };
     34 
     35 ostream& operator << (ostream &cout,const HP &x)
     36 {for(int i = x.len;i >= 1;i --) cout<<x.s[i];return cout;}
     37 
     38 HP HP::operator = (const char *str)
     39 {
     40     len = strlen(str);
     41     for(int i = 1;i <= len;i ++) s[i] = str[len-i]-'0';
     42     return (*this);
     43 }
     44 
     45 HP HP::operator = (int inte)
     46 {
     47     if(inte==0) {len = 1;s[1] = 0;return (*this);};
     48     for(len = 0;inte > 0;) {s[++len] = inte%10;inte /= 10;};
     49     return (*this);
     50 }
     51 
     52 HP HP::operator * (const HP&b)
     53 {
     54     int i,j;HP c;c.len = len+b.len;
     55     for(i = 1;i <= c.len;i ++) c.s[i] = 0;
     56     for(i = 1;i <=len;i ++) for(j = 1;j <=b.len;j ++) c.s[i+j-1]+=s[i]*b.s[j];
     57     for(i = 1;i < c.len;i ++) {c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}
     58     while(c.s[i]) {c.s[i+1]=c.s[i]/10;c.s[i]%=10;i ++;}
     59     while(i>1&&!c.s[i]) i--;c.len = i;
     60     return c;
     61 }
     62 
     63 HP HP::operator+(const HP &b)
     64 {
     65     int i;HP c;c.s[1] = 0;
     66     for(i = 1;i <=len || i<=b.len || c.s[i];i ++)
     67     {
     68         if(i<=len) c.s[i]+=s[i];
     69         if(i<=b.len) c.s[i]+=b.s[i];
     70         c.s[i+1]=c.s[i]/10;c.s[i]%=10;
     71     }
     72     c.len = i-1;if(c.len==0) c.len = 1;
     73     return c;
     74 }
     75 
     76 HP HP::operator-(const HP&b)
     77 {
     78     int i, j;HP c;
     79     for(i = 1,j = 0;i <= len;i ++)
     80     {
     81         c.s[i] = s[i]-j;if(i<=b.len) c.s[i]-=b.s[i];
     82         if(c.s[i]<0){j = 1;c.s[i]+=10;}else j = 0;
     83     }
     84     c.len = len;while(c.len>1&&!c.s[c.len]) c.len--;
     85     return c;
     86 }
     87 
     88 int HP::Compare(const HP &y)
     89 {
     90     if(len>y.len) return 1;
     91     if(len<y.len) return -1;
     92     int i = len;
     93     while((i>1)&&(s[i]==y.s[i])) i--;
     94     return s[i]-y.s[i];
     95 }
     96 
     97 bool HP::operator < (const HP &y)
     98 {
     99     if(this->Compare(y)>=0)    return false;
    100     return true;
    101 }
    102 
    103 HP HP::operator / (const HP&b)
    104 {
    105     int i,j;HP d(0),c;
    106     for(i = len;i > 0;i --)
    107     {
    108         if(!(d.len==1 && d.s[1]==0))
    109             {for(j = d.len;j > 0;j --) d.s[j+1]=d.s[j];++d.len;}
    110         d.s[1] = s[i]; c.s[i] = 0;
    111         while((j = d.Compare(b))>=0)
    112             {d=d-b;c.s[i]++;if(j==0) break;}
    113     }
    114     c.len = len;while((c.len>1)&&(c.s[c.len]==0)) c.len--;
    115     return c;
    116 }
    117 
    118 HP HP::operator%(const HP&b)
    119 {
    120     int i,j;HP d(0);
    121     for(i = len;i > 0;i --)
    122     {
    123         if(!(d.len==1 && d.s[1]==0))
    124         {for(j = d.len;j > 0;j --) d.s[j+1]=d.s[j];++d.len;}
    125     d.s[1] = s[i];
    126     while((j = d.Compare(b))>=0) {d = d-b;if(j==0)break;}
    127     }
    128     return d;
    129 }
    130 
    131 
    132 int n,m; 
    133 HP A[81][81];
    134 HP f[81][81][81];
    135 HP base[81];
    136 
    137 void Base()
    138 {
    139     base[0] = 1,base[1] = 2;
    140     _for(i,2,81)
    141         base[i] = base[i-1]*2;
    142 }
    143 int main()
    144 {
    145     ios::sync_with_stdio(false);
    146     Base();
    147     n = read(), m = read();
    148     _for(i,1,n+1)
    149         _for(j,1,m+1)
    150             A[i][j] = read();
    151     
    152     _for(i,1,n+1)
    153         _rep(len,m,0)
    154             _for(l,1,m-len+2)
    155             {
    156                 int r = l+len-1;
    157                 if(f[i][l-1][r]+A[i][l-1]*base[m-r+l-1]
    158                 <  f[i][l][r+1]+A[i][r+1]*base[m-r+l-1])
    159                     f[i][l][r] = f[i][l][r+1]+A[i][r+1]*base[m-r+l-1];
    160                 else
    161                     f[i][l][r] = f[i][l-1][r]+A[i][l-1]*base[m-r+l-1];
    162             }
    163     
    164     HP ans;
    165     ans = 0;
    166     _for(i,1,n+1)
    167     {
    168         HP tmp;
    169         tmp = 0;
    170         _for(j,1,m+1)
    171             if(tmp < f[i][j][j]+A[i][j]*base[m])
    172                 tmp = f[i][j][j]+A[i][j]*base[m];
    173         ans = ans+tmp;
    174     }
    175     cout << ans << endl;
    176     return 0;
    177 }
  • 相关阅读:
    JSON使用——获取网页返回结果是Json的代码
    关于android:inputType属性的说明
    MySQL无视密码进入Server
    Linux下MySQL使用
    Linux下mv命令详解
    软件测试:测试用例
    软件测试:概述
    《零售业务中台架构设计探讨及实践》阅读笔记
    Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题
    《小米网抢购系统开发实践》阅读笔记
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11403875.html
Copyright © 2011-2022 走看看