ZOJ 2702 Unrhymable Rhymes(DP)
发布日期:2021-09-08 01:44:58 浏览次数:44 分类:技术文章

本文共 1405 字,大约阅读时间需要 4 分钟。

题目链接:

题目大意:给定有很多数字组成的诗,譬如 “AABB”, “ABAB”, “ABBA” and “AAAA”形式的诗句是押韵的。从中挑选,求最多可以构成多少押韵句,并且输出这些句子在原序列中的位置。

Sample Input

151 2 3 1 2 1 2 3 3 2 1 1 3 2 231 2 3

Sample Output

31 2 4 57 8 9 1011 12 14 150

分析:设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次

    路径打印课真是乱啊

代码如下:

  

1 # include
2 # include
3 # include
4 # include
5 using namespace std; 6 const int N = 4005; 7 int data[N],ks[N]; 8 int n,kn; 9 int dp[N];10 vector
path[N]; //记录路径11 vector
pos[N];12 int par[N]; //路径压缩13 int out[N/4]; //输出路径14 15 void solve()16 {17 if(n < 4)18 {19 printf("0\n\n");20 return ;21 }22 kn = n;23 sort(ks,ks+kn); //原序列复制后排序24 kn = unique(ks,ks+kn) - ks; //去重函数,返回相邻不重复的个数,即元素种类数25 int i,j,k;26 for(i=0; i
tmp;37 for(i=3; i
=0; j--)46 {47 k = data[j];48 pos[k].push_back(j+1);49 if(pos[k].size()==2)50 {51 tmp.push_back(pos[k][0]);52 tmp.push_back(pos[k][1]);53 pos[k].clear();54 if(tmp.size()==4) break;55 }56 }57 if(j >= 0)58 {59 if(dp[i+1] < dp[j]+1)60 {61 dp[i+1] = dp[j] + 1;62 sort(tmp.begin(),tmp.end());63 path[i+1] = tmp; //同为vector类型,可赋值64 par[i+1] = j;65 }66 }67 }68 printf("%d\n",dp[n]);69 int u;70 u =n;71 for(i=dp[n]-1; i>=0; i--)72 {73 out[i] = u;74 u= par[u];75 }76 for(i=0; i

 

 

 

转载地址:https://blog.csdn.net/weixin_34310369/article/details/85585154 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Ubuntu登录Windows Server 2008r2 密码总是错误与NLA验证
下一篇:Dan计划:重新定义人生的10000个小时

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月10日 11时56分34秒