ZOJ 2702 Unrhymable Rhymes(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1702
题目大意:给定有很多数字组成的诗,譬如 “AABB”, “ABAB”, “ABBA” and “AAAA”形式的诗句是押韵的。从中挑选,求最多可以构成多少押韵句,并且输出这些句子在原序列中的位置。
Sample Input
15
1 2 3 1 2 1 2 3 3 2 1 1 3 2 2 3
1 2 3
Sample Output
3
1 2 4 5
7 8 9 10
11 12 14 15 0
分析:设dp[i]表示从 1 到 i 之间押韵句的最大数目,f(i,j)表示当[i,j]之间可以组出一句押韵句时为1,否则为0
则dp[i] = max{dp[i-1] , dp[j] + f(j+1,i)}
当(i,j)之间有2个数出现的次数大于等于2时,f(i,j)=1,这2个数可以相等,即1个数出现4次
路径打印课真是乱啊
代码如下:
# include<iostream>
# include<cstdio>
# include<vector>
# include<algorithm>
using namespace std;
const int N = ;
int data[N],ks[N];
int n,kn;
int dp[N];
vector<int> path[N]; //记录路径
vector<int> pos[N];
int par[N]; //路径压缩
int out[N/]; //输出路径 void solve()
{
if(n < )
{
printf("0\n\n");
return ;
}
kn = n;
sort(ks,ks+kn); //原序列复制后排序
kn = unique(ks,ks+kn) - ks; //去重函数,返回相邻不重复的个数,即元素种类数
int i,j,k;
for(i=; i<n; i++)
{
data[i] = lower_bound(ks,ks+kn,data[i]) - ks;
//lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个大于等于value 的值。
}
for(i=; i<=; i++)
{
dp[i] = ;
par[i] = -;
}
vector<int >tmp;
for(i=; i<n; i++)
{
dp[i+] = dp[i];
path[i+] = path[i];
par[i+] = par[i];
for(j=; j<kn; j++)
pos[j].clear();
tmp.clear();
for(j=i; j>=; j--)
{
k = data[j];
pos[k].push_back(j+);
if(pos[k].size()==)
{
tmp.push_back(pos[k][]);
tmp.push_back(pos[k][]);
pos[k].clear();
if(tmp.size()==) break;
}
}
if(j >= )
{
if(dp[i+] < dp[j]+)
{
dp[i+] = dp[j] + ;
sort(tmp.begin(),tmp.end());
path[i+] = tmp; //同为vector类型,可赋值
par[i+] = j;
}
}
}
printf("%d\n",dp[n]);
int u;
u =n;
for(i=dp[n]-; i>=; i--)
{
out[i] = u;
u= par[u];
}
for(i=; i<dp[n]; i++)
{
for(j=; j<; j++)
{
printf("%d ",path[out[i]][j]);
}
printf("%d\n",path[out[i]][j]);
}
puts("");
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i =; i<n; i++)
{
scanf("%d",&data[i]);
ks[i] = data[i];
}
solve();
}
return ;
}
ZOJ 2702 Unrhymable Rhymes(DP)的更多相关文章
- ZOJ 4027 Sequence Swapping(DP)题解
题意:一串括号,每个括号代表一个值,当有相邻括号组成()时,可以交换他们两个并得到他们值的乘积,问你最大能得到多少 思路:DP题,注定想得掉头发. 显然一个左括号( 的最远交换距离由他右边的左括号的最 ...
- ZOJ 2702 Unrhymable Rhymes 贪心
贪心.能凑成一组就算一组 Unrhymable Rhymes Time Limit: 10 Seconds Memory Limit: 32768 KB Special Judge ...
- ZOJ 2702 Unrhymable Rhymes
Unrhymable Rhymes Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu De ...
- ZOJ 2625 Rearrange Them(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1625 题目大意:将n个数重新排列,使得每个数的前一个数都不能和之前的 ...
- ZOJ 2745 01-K Code(DP)(转)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1745 题目大意:一个串由N个字符组成,每个字符是‘0’或者是‘1’, ...
- ZOJ 1013 Great Equipment(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=13 题目大意:说的是有三种不同的装备,分别是头盔,盔甲,战靴需要运输, ...
- ZOJ 3211 Dream City(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3374 题目大意:JAVAMAN 到梦幻城市旅游见到了黄金树,黄金树上 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
随机推荐
- LINUX系统怎么关闭防火墙?
所谓防火墙指的是一个由软件和硬件设备组合而成.在内部网和外部网之间.专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Int ...
- Linux 下svn恢复到某一版本
经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge 1) 先 svn up,保证更新到最新的版本,如20: 2) 然后用 svn log ,查看历史 ...
- POJ2739 - Sum of Consecutive Prime Numbers(素数问题)
题目大意 给定N,要求你计算用连续的素数的和能够组成N的种数 题解 先筛选出素数,然后暴力判断即可... 代码: #include<iostream> #include<cstrin ...
- Oracle- 初识
我一直没用过ORACLE.今天总算装上了,说一下我装的过程,感觉还是有点折腾的. 一.我装的是ORACLE 9版本,从网上下载的总大小1.3G.是三个压缩包. 首先我解压三个压缩包后,使用UltraI ...
- Identity-第三章 Authorize原理解析
本篇旨在解析Identity中角色限制的原理. 需要的工具:Visual Studio.Reflector 问题提出: 1.当我们需要限制某个Controller的名称只需要某个或者某几个角色访问,这 ...
- CopyU!v2.2 增加对设备信息的识别
更新版本的CopyU!v2.2已经完成大部分功能的设计,主打升级功能“设备信息识别”已经基本完成,现在放上测试截图:
- Spring 3.0 注解注入详解
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- ios8 关于UIAlertController 代替UIActionsheet
self.alertController=[UIAlertController alertControllerWithTitle:@"请选择\n\n\n\n\n\n\n\n\n\n\n\n\ ...
- c++虚表的使用 通过虚表调用虚函数的演示代码
//演示一下c++如何找到虚表地址vptr以及如何通过虚表调用虚函数 //zhangpeng@myhexin.com 20130811 #include <iostream> using ...
- gitservergitlab之搭建和使用
gitserver比較有名的是gitosis和gitolite,这两个管理和使用起来略微有些复杂,没有web页面,而gitlab则是类似于github的一个工具,github无法免费建立私有仓库,而且 ...