不充钱,你怎么AC?

  题目:http://codevs.cn/problem/1166/

  有许久没有刷题了,忙着过中秋去了嘿嘿

  首先它的每一行是独立的,我们可以直接把它拆分成 n 互不相关的子问题做

  那么就变成了区间 DP 问题,f[i][j] 表示在区间 [i,j] 内的最大分数,首先枚举区间长度 k,然后再枚举左端点 i

    

  n 表示的是一行数的个数

  注意 k 要到-1,是因为 f[i][i] 时还有一个 a[i] 没有取走,目标状态是 max ( f[i][i-1] ) ,(i=1~n)

 #include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 90
using namespace std; long long a[N],f[N][N],m,ans,t,n;
int main()
{
long long i,k;
cin>>t>>n;
while (t>)
{
t--;
for (i=;i<=n;i++) cin>>a[i];
for (k=n-;k>=-;k--)
{
for (i=;i<=n-k;i++)
{
f[i][i+k]=max(f[i-][i+k]+a[i-]*(<<(n-k-)),f[i][i+k+]+a[i+k+]*(<<(n-k-)));
}
}
m=;
for (i=;i<=n;i++) m=max(m,f[i][i-]);
ans+=m;
}
cout<<ans<<endl;
return ;
}

  这段代码交上去只有60分,是为什么呢?

  查了很久的问题,结果返回一看题目数据范围,要写高精度……当年应该觉得这道题太简单了,于是就放个高精度卡掉选手40分

  那么就写一个高精度的加法和比较大小即可,直接贴别人的代码嘿嘿

 #include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 100
#define base 10000
using namespace std; int n,m,cnt=,lp[],rp[];
int map[][];
struct Bign
{
int c[maxn],len;
Bign ()
{
memset(c,,sizeof(c)),len=;
}
void Zero()
{
while(len>&&c[len]==)len--;
}
void Write(char *s)
{
int l=strlen(s);
int k=;
for(int i=l-;i>=;i--)
{
c[len]+=k*(s[i]-'');
k*=;
if(k==base)
{
k=;len++;
}
}
}
void Read()
{
char s[maxn];
scanf("%s",s);
Write(s);
}
void Print()
{
printf("%d",c[len]);
for(int i=len-;i>=;i--) printf("%04d",c[i]);
printf("\n");
}
Bign operator = (const int &a)
{
memset(c,,sizeof(c));
len=;
char s[maxn];
sprintf(s,"%d",a);
Write(s);
Zero();
return *this;
}
Bign operator +(const Bign &a)
{
Bign r;
r.len=max(len,a.len)+;
for(int i=;i<=r.len;i++)
{
r.c[i]+=c[i]+a.c[i];
r.c[i+]+=r.c[i]/base;
r.c[i]%=base;
}
r.Zero();
return r;
}
Bign operator +(const int &a)
{
Bign b;
b=a;
return *this+b;
}
Bign operator *(const Bign &a)
{
Bign r;
r.len=len+a.len+;
for(int i=;i<=len;i++)
{
for(int j=;j<=a.len;j++)
{
r.c[i+j-]+=c[i]*a.c[j];
}
}
for(int i=;i<=r.len;i++)
{
r.c[i+]+=r.c[i]/base;
r.c[i]%=base;
}
r.Zero();
return r;
}
Bign operator *(const int &a)
{
Bign b;
b=a;
return *this*b;
}
bool operator < (const Bign &b)const
{
if(len!=b.len) return len<b.len;
else
{
for(int i=len;i>=;i--)
{
if(c[i]!=b.c[i]) return c[i]<b.c[i];
}
}
return ;
}
bool operator >(const Bign &b)const
{
return b<*this;
}
bool operator <=(const Bign &b)const
{
return !(b>*this);
}
bool operator >=(const Bign &b)const
{
return !(b<*this);
}
bool operator == (int a)
{
return len== && c[len]==a;
}
};
Bign f[][];
Bign Max(Bign a,Bign b)
{
if(a>=b) return a;
if(a<b) return b;
}
int main()
{
Bign ans;
ans=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}
for (int i=;i<=n;i++)
{
for(int u=;u<=m;u++)
for(int v=;v<=m;v++) f[v][u]=;
for (int j=;j<=m;j++)
{
f[j][j]=map[i][j]*;
}
for(int len=;len<=m-;len++)
{
for(int l=;l<=m&&l+len<=m;l++)
{
Bign k;
k=max(f[l+][l+len]+map[i][l],f[l][l+len-]+map[i][l+len]);
f[l][l+len]=k*;
}
}
ans=ans+f[][m];
}
ans.Print() ;
return ;
}

[ CodeVS冲杯之路 ] P1166的更多相关文章

  1. [ CodeVS冲杯之路 ] P1368

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...

  2. [ CodeVS冲杯之路 ] P1092

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...

  3. [ CodeVS冲杯之路 ] P3955

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...

  4. [ CodeVS冲杯之路 ] P1165

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节 ...

  5. [ CodeVS冲杯之路 ] P1053

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...

  6. [ CodeVS冲杯之路 ] P1171

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...

  7. [ CodeVS冲杯之路 ] P1197

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...

  8. [ CodeVS冲杯之路 ] P2492

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直 ...

  9. [ CodeVS冲杯之路 ] P2456

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木 ...

随机推荐

  1. Zookeeper+Kafka的单节点配置

    Zookeeper+Kafka的单节点配置 环境描述:Ubuntu16.04 server系统,在系统上搭建Java环境,jdk的版本为1.8或更高,我的服务器IP地址为192.168.0.106. ...

  2. iOS常用控件-UIScrollView

    一. 常见属性 @property (nonatomic) CGPoint contentOffset;                      //记录UIScrollView滚动的位置 @pro ...

  3. IDA 对 so 的动态调试

    将IDAPro根目录下dbgsrv 目录下的android_server(模拟器用android_x86_server,这里还是用真机好点)文件push 到安卓设备(比如/data/local/tmp ...

  4. vue命令集合

    创建vuecli脚手架:npm install -g @vue/cli拉取2的版本:npm install -g @vue/cli-init 创建webpack:npm i webpack@3.12. ...

  5. CodeForces 778D Parquet Re-laying 构造

    题意: 有两个\(n \times m\)的矩阵\(A,B\),都是由\(1 \times 2\)的砖块铺成,代表初始状态和结束状态 有一种操作可以把两个砖块拼成的\(2 \times 2\)的矩形旋 ...

  6. stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory

    stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory解决办法:在hbase-env ...

  7. 《Cracking the Coding Interview》——第2章:链表——题目4

    2014-03-18 02:27 题目:将一个单链表按照一个值X分为两部分,小于X的部分放在大于等于X的部分之前. 解法:按照值和X的大小,分链表为两条链表,然后连起来成一条. 代码: // 2.4 ...

  8. Intellij 设置只更新静态文件(js、view、css)的方法

    1.打开 Tomcat Run/Debug configuration 2.打开Deployment标签 3.在“Deploy at Server Startup” 中,移出现有的.war 包 4.点 ...

  9. Python 3基础教程2-打印语句和字符串

    本文介绍Python 3中的打印语句和字符串使用,具体练习请看下面的demo.py print ('Hello Python 3!') """文本讲打印语句和字符串打印语 ...

  10. Mysql忘记root密码怎么办?(已解决)

    为了写这篇文档,假装一下忘记密码!!!! 首先我数据库是正常的,可以使用. root@localhost:~# mysql -uroot -p mysql> mysql> show dat ...