NOIP2007 矩阵取数 DP+高精度

来源:互联网 发布:软件行业销售模式 编辑:程序博客网 时间:2024/06/05 06:18

这个题并不难想……但是高精度和DP的组合有点恶心……

不说了 都是QAQ

代码如下:

我用的重定义运算符。。。 乘法小小的偷个懒。。。 因为只有*2...

/* 手动测NOIP数据全过但是评测30分。。。不做了。。。另:A了是比较运算符的问题 用刘汝佳的过了。。。 */ #include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct bigint{vector<long long>s;void clean(){s.clear();s.push_back(0);}bigint operator + (const bigint& b)const{int i;bigint c;c.s.clear();int maxs=s.size(),maxb=b.s.size();for(int i=0,g=0;;i++){if(g==0&&i>=maxs&&i>=maxb)break;int x=g;if(i<maxs)x+=s[i];if(i<maxb)x+=b.s[i];c.s.push_back(x%10000);g=x/10000;}return c;}bool operator < (const bigint& b)const{if(s.size()!=b.s.size())return s.size()<b.s.size();for(int i=s.size()-1;i>=0;i--)if(s[i]!=b.s[i])return s[i]<b.s[i];return false;}}ans,f[200][200],mp[200];bigint max1(bigint a,bigint b){if(a<b)return b;return a;}bigint mult(bigint a){return a+a;}void fout(long long x){if(x<10)printf("000%lld",x);elseif(x<100)printf("00%lld",x);elseif(x<1000)printf("0%lld",x);elseprintf("%lld",x);return;}void putout(bigint a){int flag=1;for(int i=a.s.size()-1;i>=0;i--)if(a.s[i]==0&&flag==1)continue;else{if(flag==1)printf("%lld",a.s[i]);else fout(a.s[i]);flag=0;}if(flag==1)printf("0\n"); return;}int n,m;int main(){int x;ans.clean();scanf("%d%d",&n,&m);for(int i=0;i<=100;i++)for(int j=0;j<=100;j++)f[i][j].clean();for(int i=1;i<=n;i++){bigint sum;sum.clean();for(int j=1;j<=m;j++){mp[j].s.clear();scanf("%d",&x);mp[j].s.push_back(x);}for(int x=m;x>=1;x--)for(int y=x;y<=m;y++)f[x][y]=mult(max1(f[x+1][y]+mp[x],f[x][y-1]+mp[y]));ans=ans+f[1][m];}putout(ans);return 0;} 


0 0
原创粉丝点击