[ CodeVS冲杯之路 ] P1166
不充钱,你怎么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的更多相关文章
- [ CodeVS冲杯之路 ] P1368
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...
- [ CodeVS冲杯之路 ] P1092
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...
- [ CodeVS冲杯之路 ] P3955
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...
- [ CodeVS冲杯之路 ] P1165
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节 ...
- [ CodeVS冲杯之路 ] P1053
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...
- [ CodeVS冲杯之路 ] P1171
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...
- [ CodeVS冲杯之路 ] P1197
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...
- [ CodeVS冲杯之路 ] P2492
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直 ...
- [ CodeVS冲杯之路 ] P2456
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木 ...
随机推荐
- python中的列表内置方法小结
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' names=['zhangyu','mahongyan','zhangguobin','shac ...
- python_字符串_常用处理
1. 输出原序列的反向互补序列 in1 = open("brca1.fasta", "r") out1 = open("re_brca1.fasta& ...
- C语言进阶——有符号与无符号02
在计算机的内部,我们所有的信息都是由二进制数字组成的 有符号数的表实法: 在计算机内部用补码的方式表实有符号数 正数的补码位正数的本身 负数的补码为其绝对值取反然后加一得到 例如-7 他在计算机内部的 ...
- UCLOUD使用云主机
购买云主机后,购买弹性ip: 设置外网防火墙,浏览器否则无法访问服务器资源: 在云主机绑定自定义的防火墙: 使用ssh登录服务器: 一般centos自带apache,没有的话安装,具体教程百度: 安装 ...
- 20145202马超 《Java程序设计》第六周学习总结
进程:是一个正在执行中的程序,每一个进程都有一个执行程序,该顺序是一个执行路径,或者说是一个控制单元. 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行. 一个进程至少有一线程. Java ...
- 十一、mysql老是停止运行该怎么解决
mysql老是停止运行该怎么解决 你可能还会遇到无法启动mysql的错误 解决方法如下:
- android stadio 快捷键最好的材料 android stadio大全 最牛逼的android stadio快捷键
一: .nn .if .for .toast .instanceof .switch 这些都是可以直接点的,一个变量然后.for ,如果这个这个变量是个集合,都可以.for 二: 关闭所有窗口 ctr ...
- 如何使用API创建OpenStack虚拟机?
在安装时OpenStack会加载配置信息.有不同的虚拟机模板而且与在Amazon EC2以及其他平台上看到的完全一样.这些配置是内存.vCPU.磁盘容量等的组合,定义了虚拟机的大小及容量.可以使用如下 ...
- Android学习笔记(四)之碎片化Fragment实现仿人人客户端的侧边栏
其实一种好的UI布局,可以使用户感到更加的亲切与方便.最近非常流行的莫过于侧边栏了,其实我也做过很多侧边栏的应用,但是那些侧边栏的使用我 都不是很满意,现在重新整理,重新写了一个相对来说我比较满意的侧 ...
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目2
2014-04-23 17:45 题目:假设有个呼叫中心,有接线员.经理.主管三种角色.如果接线员无法处理呼叫,就上传给经理:如果仍无法处理,则上传给主管.请用代码描述这一过程. 解法:第一眼觉得这题 ...