题解 P6509 【[CRCI2007-2008] JEDNAKOST】
这道题感觉是一个很另类的DP 至少我的做法是这样的。
重要前置思想:把A存成字符串!!! (应该也没人会想着存成int和long long 吧)
首先,我们定义状态f[i][j]: 当我们处理A字符串到第i个位置时,我们还差j就能使式子的和等于B。
于是,开始想手摸状态方程。
嗯?怎么感觉有点难搞。 没事,慢慢来。
定义n = strlen(A), 即A字符串的长度, sum为剩下仍需要的数
首先看特殊情况:
如果i == n, 那么:
case1: sum < 0 ,很明显不符合要求,令f[n][sum] = INF;
case2: sum > 0, 同上,并不能满足等式成立,f[n][sum] = INF;
case3:sum = 0,符合我们的要求,令 f[n][sum] = 0;
那么,对于其余的情况,我们很容易有:
f[i][sum] = min{f[i + 1][num - A[position] | i <= position < n};
可是。这里要用到 i + 1啊,怎么实现?
递归呗!!
设计一个函数change,在递归过程中返回下一层(i + 1)层的值,同时修改f数组即可。
还没完!! 注意到题目中的前置0了吗? 如何处理这种情况呢??
如此考虑:如果我们出现 " xx + 0 + xx",这种情况肯定不是最优的,因为我们完全可以写成 " xx + 0xx" ,两边的式子大小一样,可是加号却被浪费了。于是,我们设定一个pre数组,作为循环时的起始点,作为对‘0’位置的特判。如果位置是0,我们则从其上一位(i + 1)开始循环,否则从他自己。
友情Tips:INF千万不要设成 ~0u >> 1、 2147483647等int上限,因为函数中有个地方要 + 1, 会超过上限。(为此我WA + RE了两遍)
细节标记在代码中了,没讲清楚的地方可以尝试着看看代码QAQ
上一波代码:
#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9; /*千万不能写成int的极大值!!!下面会 + 1,造成错误*/
#define N 1010 char A[N];
int B; /*同题目*/
int pre[N], f[N][N * ]; /*f是动规数组,pre为起始点(给 ‘0’用的)*/
int n; /*字符串的长度*/ int change(int now, int sum){
if(now == n)return sum == ? : INF;
int &cur = f[now][sum]; /*建个指针,懒得打那么长的 f数组*/
if(cur != -){
return cur;
}
cur = INF;
int temp = ;
for(int j = pre[now]; j < n; j++){
temp = temp * + A[j] - ''; /*往上累加*/
if(temp > sum) break;
int hehe = change(j + , sum - temp);
cur = cur < hehe + ? cur : hehe + ;
}
return cur;
} int solve(int now, int sum){ /*输出思路:一变输出A字符串,一边穿插 +号*/
if(now == n){
printf("=%d\n", B);
return ;
}
if(now > )printf("+");
int num = ;
for(int j = now;j < n; j++){
printf("%c", A[j]);
num = num * + A[j] - '';/*有点快读那味儿了*/
if(change(now, sum) == + change( j + , sum - num)){
return solve(j + , sum - num);
}
}
return ;
} int main(){
char c = getchar();
while(isdigit(c)){
A[n++] = c;
c = getchar();
}
scanf("%d", &B);
n = strlen(A);
pre[n-] = n - ;
for(int i = n - ; i >= ; i--){
pre[i] = (A[i] == '') ? pre[i + ] : i;
}
memset(f, -, sizeof(f));
solve(, B);
return ;
}
题解 P6509 【[CRCI2007-2008] JEDNAKOST】的更多相关文章
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
- [BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)
[BZOJ 1013][JSOI 2008] 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面 ...
- usaco 2008 月赛 lites 开关灯 题解
题目: Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是 牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一 ...
- bzoj 1600 & Usaco 月赛 2008 建造栅栏 题解
[原题] 1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 785 Solved: 443 [Subm ...
- 2008年NOIP普及组复赛题解
题目涉及算法: ISBN号码:简单字符串模拟: 排座椅:贪心: 传球游戏:动态规划: 立体图:模拟. ISBN号码 题目链接:https://www.luogu.org/problem/P1055 简 ...
- noip2008普及组3题题解-rLq
(第一次写题解,随意喷) (只是前一天的作业哈) (先凑个数) 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈 ...
- NOIP2008普及组题解
NOIP2008普及组题解 从我在其他站的博客直接搬过来的 posted @ 2016-04-16 01:11 然后我又搬回博客园了233333 posted @ 2016-06-05 19:19 T ...
- Codevs 2296 仪仗队 2008年省队选拔赛山东
2296 仪仗队 2008年省队选拔赛山东 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 作为体育委员,C君负责这次运动 ...
随机推荐
- CF1335E Three Blocks Palindrome
就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A..... 题意 定义一种字串为形如:\([\underbrace{a, a ...
- 2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析
内容了解 """ .接口:什么是接口.restful接口规范 .CBV生命周期源码 - 基于restful规范下的CBV接口 .请求组件.解析组件.响应组件 .序列化组件 ...
- C++ 函数重载,函数模板和函数模板重载,选择哪一个?
重载解析 在C++中,对于函数重载.函数模板和函数模板重载,C++需要有一个良好的策略,去选择调用哪一个函数定义(尤其是多个参数时),这个过程称为重载解析. (这个过程将会非常复杂,但愿不要遇到一定要 ...
- vue获取当前时间 实时刷新
需求:获取当前系统时间,在页面上展示 年月日 时分秒 ,并且实时刷新,和系统时间保持一致 第一步:在deta 里面声明两个变量第二步:把时间调用写在created() 生命周期里面,进入页面就需要调用 ...
- webpack-基础知识
一.webpack介绍 webpack是一个前端模块化工具,简单解释:webpack就是处理多个文件,根据设置的规则,对文件进行合并和修改. 正式说:webpack是一个模块化打包工具.从入口模块出发 ...
- 中文分词工具简介与安装教程(jieba、nlpir、hanlp、pkuseg、foolnltk、snownlp、thulac)
2.1 jieba 2.1.1 jieba简介 Jieba中文含义结巴,jieba库是目前做的最好的python分词组件.首先它的安装十分便捷,只需要使用pip安装:其次,它不需要另外下载其它的数据包 ...
- Linux 内核工作队列之work_struct 学习总结
前言 编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有de ...
- nginx源码安装方法
nginx源码安装方法 安装方法如下 1.安装nginx必要的源码依赖软件包. yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zli ...
- 存储过程——异常捕获&打印异常信息
目录 0. 背景说明 1. 建立异常信息表ErrorLog 2. 建立保存异常信息的存储过程 3. 建立在SQL Server中打印异常信息的存储过程 4. 建立一个用于测试的存储过程抛出异常进行测试 ...
- 超过百万的StackOverflow Flutter 问题-第二期
老孟导读:一个月前分享的<超过百万的StackOverflow Flutter 问题-第一期>受到很多朋友的喜欢,非常感谢大家的支持,在文章末尾有第一期的链接,希望此文能对你有所帮助. N ...