本来看了题解尝试自己写,然后WA倒怀疑人生,完全不知道怎么记录翻转的区间

于是对着https://blog.csdn.net/qq_34454069/article/details/81475646改代码,改到几乎一样了才过= =,我发现每次我的dp记录方案都会WA到怀疑人生,菜不成声.jpg。

我们设b数组为翻转后的区间0,1,2,.xy,(y-1)..x,y,y+1,9,spl为翻转的左区间端点,spr为翻转的右区间端点,记住翻转区间端点部分x,y出现了2次,然后对a数组和b数组进行最长公共子序列的操作。神奇的地方来了,对于f[i][j]表示a数组前i位于b数字前j位匹配的最优值,设tl[i][j]为到f[i][j]取最优值的时候左区间端点的翻转最左位置在哪里,tr[i][j]为右区间端点翻转的最右位置,然后在j=spl  和 j=spr的时候猜对tl[i][j]和tr[i][j]进行值的更新,不然直接等于以前的值。

注意一个问题,a[i]位置等于b[j]的时候才能选,而且选的时候要么从f[i-1][j]转移过来,要么从f[i-1][j-1]转移过来,也就是a[i]作为b[j]的第一个,我并不知道上面贴的链接里的代码为什么这一句不加也A了。

第二种情况,如果f[i][j-1]>f[i][j]的话,转移过来,说明此时值选b[1]到b[j-1]得到最优值,因为状态是f[i][j]表示a数组前i位于b数字前j位匹配的最优值,有可能中间有个值不匹配不存在,依然继续维护处最优值进行后面的dp。

#include<cstdio>
#include<cstring>
#define maxl 100010int n,len,spl,spr,ansl,ansr,ans;
int a[maxl];
int b[22],num[22];
int f[maxl][22];
int tl[maxl][22],tr[maxl][22];
char s[maxl];
bool in[11];inline void prework()
{scanf("%d",&n);scanf("%s",s+1);memset(in,false,sizeof(in));for(int i=1;i<=n;i++)a[i]=s[i]-'0',in[a[i]]=true;len=0;for(int i=0;i<=9;i++)if(in[i])num[++len]=i;
}inline int dp(int cnt)
{for(int j=0;j<=cnt;j++)f[0][j]=0;for(int i=1;i<=n;i++)for(int j=1;j<=cnt;j++){f[i][j]=f[i-1][j];tl[i][j]=tl[i-1][j];tr[i][j]=tr[i-1][j];if(b[j]==a[i]){f[i][j]=f[i-1][j]+1;if(f[i-1][j-1]+1>f[i][j]){f[i][j]=f[i-1][j-1]+1;tl[i][j]=tl[i-1][j-1];tr[i][j]=tr[i-1][j-1];}if(spl==j&&tl[i][j]==0)tl[i][j]=i;if(spr==j)tr[i][j]=i;}if(f[i][j-1]>f[i][j]){f[i][j]=f[i][j-1];tl[i][j]=tl[i][j-1];tr[i][j]=tr[i][j-1];}}int tmp=0;tmp=f[n][cnt];/*for(int j=1;j<=len;j++)if(f[n][j]>tmp)tmp=f[n][j];*/return tmp;
}inline void mainwork()
{for(int l=1;l<=len;l++)b[l]=num[l];ans=dp(len);ansl=1;ansr=1;int tmp;for(int i=1;i<=len;i++)for(int j=i+1;j<=len;j++){int cnt=0;for(int l=1;l<=i;l++)b[++cnt]=num[l];spl=cnt+1; for(int l=j;l>=i;l--)b[++cnt]=num[l];spr=cnt;for(int l=j;l<=len;l++)b[++cnt]=num[l];tmp=dp(cnt);if(tmp>ans && tl[n][cnt] && tr[n][cnt]){ans=tmp;ansl=tl[n][cnt];ansr=tr[n][cnt];}     }
}inline void print()
{printf("%d %d %d\n",ans,ansl,ansr);
}int main()
{int t;scanf("%d",&t);for(int i=1;i<=t;i++){prework();mainwork();print();}return 0;
}

HDU6357 Hills And Valleys相关推荐

  1. Hills And Valleys CodeForces - 1467B

    Hills And Valleys CodeForces - 1467B 题意: 修改数列中的 一个 数字 使得峰(波峰.波谷)的数量最少 题解: 修改一个数,最多只能影响左右两个数,所能减少的峰的数 ...

  2. Hills And Valleys CodeForces - 1467B 思维

    给你一个数组,最多可以修改一个数,问最少的山峰和山谷数量之和. 小菜鸡做了一年. 一上来想猜个结论,让每个数等于其相邻的两个数,看了题解之后也证明的正确性,当时直接写就没后面这么多事了. 但是命运让我 ...

  3. 洛谷 P2893 [USACO08FEB]修路Making the Grade 解题报告

    P2893 [USACO08FEB]修路Making the Grade 题目描述 A straight dirt road connects two fields on FJ's farm, but ...

  4. 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解

    H: Intelligent Parking Building 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 20 [提交][状态][讨论版] 题目描述 There is ...

  5. 河南省第十届省赛 Plumbing the depth of lake (模拟)

    title: Plumbing the depth of lake 河南省第十届省赛 题目描述: There is a mysterious lake in the north of Tibet. A ...

  6. Making the Grade POJ - 3666(离散化+dp)

    题意: 给你n个山的高度,单独的一个数可以任意加减,让经过对每座山峰任意加减高度后变成递增或递减的序列时,求对每个数的相加或相减的数目的最小和. 题目: A straight dirt road co ...

  7. Codeforces Round #695(Div. 2)

    Codeforces Round #695 (Div. 2) 1467A Wizard of Orz 1467B Hills And Valleys 1467C Three Bags 1467D Su ...

  8. the spell of the rising moon

    原文: The spell of the rising moon There is a hill near my home that I often climb at night.The noise ...

  9. Codeforces Round #695 (Div. 2)ABCD题解详析

    A. Wizard of Orz 首先保证第一块板子是999,那么第二块板子不可能是999,那么令第二块板子为888 只要在第二块板到达888的时候按下暂停,那么第一块是999,第三块板子也是999 ...

  10. poj3666(基础dp+离散化)

    题目链接:http://poj.org/problem?id=3666 Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total ...

最新文章

  1. 《需求分析》读后感之二
  2. 高逼格的画图:VIM原来可以这样玩
  3. boost::program_options模块实现使用命令行和配置文件的测试程序
  4. 利用Hexo搭建个人博客-博客初始化篇
  5. 测试眉形的有哪个软件_这五款自动化软件测试工具,你最喜欢用哪个?
  6. 【数学】拉格朗日插值(luogu 4781/金牌导航 拉格朗日插值-1)
  7. Android入门逆引手册 - 12 评分条(RatingBar)的使用
  8. 校验json格式_格式化展示,校验错误,编辑JSON,这几个JSON工具一定不能错过
  9. [转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
  10. c语言python字典结构_在python中创建类似C语言中struct的结构来保存数据
  11. python科学计算常用包-python常用包及功能介绍
  12. 图解TCPIP---第二章
  13. R语言大作业(三):新乡市、郑州市不同学历毕业生信息统计
  14. 26. 平衡二叉排序树
  15. PS如何使用自定义画笔
  16. SpringCloud-粪发涂墙90
  17. 基于到达时间差(TDOA)的室内定位(/无线传感器网络定位)——极大似然估计ML
  18. 哈罗单车打不开锁,显示:“可能卡住了 重新开锁”
  19. 7月第3周回顾:裁员潮袭卷IT人 雅虎服“软”愿被收购
  20. python+selenium自动登录163邮箱代码提示错误解决方案(如:NoSuchFrameException: Message: no such frame)

热门文章

  1. C语言基础之14:结构和其他数据形式
  2. Python数据的输出
  3. 图的表示(无权图和有权图)
  4. 偏流角为什么是arcsin(w/V)
  5. 关于python中的数学方法(math)(全)
  6. Java牛客网输入测试用例
  7. Helio P10 (MT6755)
  8. Typo: In word xxxx
  9. flutter:掌握布局约束Constraint
  10. 磨金石教育摄影干货分享|风光摄影后期教程:冷色调变暖色调