ural1238. Folding(记忆化)
这算模拟加记忆化吗 找bug找了2个多小时。。记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
using namespace std;
#define INF 0xfffffff
int dp[][],o[][];
char s[][][],ss[];
int len(int x)
{
int q=;
while(x)
{
q++;x/=;
}
return q;
}
int dfs(int x,int y)
{
if(dp[x][y]!=INF) return dp[x][y];
if(x==y)
{
s[x][y][] = ss[x];
s[x][y][] = '\0';
o[x][y] = ;
return dp[x][y] = ;
}
int i,j,flag,k;
for(i = x ; i < y ; i++)
{
dp[x][i] = dfs(x,i);
dp[i+][y] = dfs(i+,y);
flag = ;
k = INF;
if(strcmp(s[x][i],s[i+][y])==)
{
int t = ;
if(o[x][i]+o[i+][y]>)
t+=;
t+=len(o[x][i]+o[i+][y]);
k = strlen(s[x][i])+t;flag = ;
}
if(dp[x][i]+dp[i+][y]<k)
{
k = dp[x][i]+dp[i+][y];//cout<<s[x][i]<<" "<<s[i+1][y]<<" "<<" "<<i+1<<" "<<y<<" "<<dp[x][y]<<endl;
}
if(dp[x][y]<=k&&!flag) continue;
if(dp[x][y]>=k)
{
dp[x][y] = k;
if(!flag)
{
int g = ,q=;
int k1 = strlen(s[x][i]);
if(o[x][i]<=&&k1==)
{
for(j = ; j <= o[x][i]; j++)
s[x][y][g++] = s[x][i][];
}
else if(o[x][i]<=&&k1==)
{
for(j = ; j <= o[x][i] ; j++)
{
s[x][y][g++] = s[x][i][];
s[x][y][g++] = s[x][i][];
}
}
else
{
if(o[x][i]>)
{
int qq = o[x][i],a[],t=;
while(qq)
{
a[t++] = qq%;
qq/=;
}
for(j = t- ; j >= ; j--)
s[x][y][g++] = a[j]+'';
s[x][y][g++] = '(';
q = ;
}
for(j = ; j < k1;j++)
s[x][y][g++] = s[x][i][j];
if(q)
s[x][y][g++] = ')';
}
k1 = strlen(s[i+][y]);q=;
if(o[i+][y]<=&&k1==)
{
for(j = ; j <= o[i+][y]; j++)
s[x][y][g++] = s[i+][y][];
}
else if(o[i+][y]<=&&k1==)
{
for(j = ; j <= o[i+][y] ; j++)
{
s[x][y][g++] = s[i+][y][];
s[x][y][g++] = s[i+][y][];
}
}
else
{
if(o[i+][y]>)
{
int qq = o[i+][y],a[],t=;
while(qq)
{
a[t++] = qq%;
qq/=;
}
for(j = t- ; j >= ; j--)
s[x][y][g++] = a[j]+'';
s[x][y][g++] = '(';
q = ;
}
for(j = ; j < k1;j++)
s[x][y][g++] = s[i+][y][j];
if(q)
s[x][y][g++] = ')';
}
o[x][y] = ;
s[x][y][g] = '\0';
}
else
{
strcpy(s[x][y],s[x][i]);
//cout<<s[x][y]<<" "<<x<<" "<<y<<endl;
o[x][y] = o[x][i]+o[i+][y];
}
}
}
return dp[x][y];
}
int main()
{
int i,j,k;
for(i = ;i <= ; i++)
for(j = ;j <= ; j++)
dp[i][j] = INF;
cin>>ss;
k = strlen(ss);
int minz = dfs(,k-),q=strlen(s[][k-]);
//cout<<q<<endl;
if(o[][k-]<=&&q==)
for(i = ; i <= o[][k-] ; i++)
cout<<s[][k-][];
else if(o[][k-]<=&&q==)
for(i = ; i <= o[][k-] ; i++)
{
cout<<s[][k-][]<<s[][k-][];
}
else
{
if(o[][k-]>)
cout<<o[][k-]<<'(';
for(i = ; i < q ; i++)
cout<<s[][k-][i];
if(o[][k-]>)
cout<<')';
}
puts("");
return ;
}
ural1238. Folding(记忆化)的更多相关文章
- *HDU1142 最短路+记忆化dfs
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- hdu 4826(dp + 记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
随机推荐
- socket网络编程中read与recv区别
socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...
- Windows Server
1. Windows Server 在试用license过期后会出现2小时一次的关机.如果暂时无法注册或者激活,下面的方法可以试试 taskkill /f /im wlms.exe ping -n 1 ...
- POJ 2000
#include<iostream> #include<cstdio> #define MAXN 10009 using namespace std; ]; int main( ...
- POJ 1469
#include<iostream> #include<stdio.h> #include <string.h> #include <vector> # ...
- MyEclipse 2015 CI
系统 win8.1 MyEclipse 2015 CI 激活后可用 激活工具 地址:http://download.csdn.net/detail/trep10000/8305577
- Android是什么 之三手机之硬件形态
手机硬件形态 本节可能与Android无关,但是Android系统现在这个阶段更多的是移动终端形态的开发平台,本节给出了Android背后的工作-Android管理的硬件是什么,Android的本质就 ...
- sql server2008禁用远程连接
1.打开SQL Server 配置管理器,双击左边 SQL Server 网络配置,点击TCP/IP协议,在协议一栏中,找到 全部侦听,修改为否,然后点击IP地址,将IP地址为127.0.0.1(IP ...
- Sqoop详细介绍包括:sqoop命令,原理,流程
一简介 Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS ...
- iOS开发--泛型
一. 泛型函数 1.单一占位符泛型函数 下面就使用一个经典案例:两个数值进行交换.来使用泛型,写一个通用的函数,这个函数的功能就是交换两个变量的值.在Swift中不允许类型隐式转换,也就是说,如果你定 ...
- iOS 网络请求NSURLSession
iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...