【学术篇】一些水的不行的dp
来源:互联网 发布:知乎 english in use 编辑:程序博客网 时间:2024/05/19 02:19
最近做了几道非常水非常水的dp……
之后刷的一些水dp也会写在这里……
此篇题目难度不递增!!!
Emmmm…….
1.luogu1043数字游戏
以前看过这个题几遍,没做这个题(觉得太难了)……
就是一道环形的区间dp……本来想按常规的思路拆成2n做,但是换算坐标好麻烦,
然后一看n,m好小于是就直接强行把数组错位做了……
设
用
inline int mod(const int &t){return (x%10+10)%10;} //题目说过都是模数都是正数所以就是介个意思..
状态转移方程:
就是枚举k,然后让k之前的分j-1份,k+1..i分第j份,然后算就行了…
时间复杂度
代码(贴不贴的吧,有些变量名什么的都是细节啦):
#include <cstdio>#include <cstring>const int N=105;int s[N],a[N],f[N][15],g[N][15];inline int gn(){ int a=0;char c=getchar();bool f=0; for(;(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-') c=getchar(),f=1; for(;c>='0'&&c<='9';c=getchar()) a=(a<<1)+(a<<3)+c-'0'; if(f) return -a; return a;}inline int max(const int &a,const int &b){if(a>b) return a; return b;}inline int min(const int &a,const int &b){if(a<b) return a; return b;} inline int mod(const int &x){return (x%10+10)%10;}int main(){ int n=gn(),m=gn(),mx=-0x7FFFFFFF,mn=0x7FFFFFFF; for(int i=1;i<=n;i++) a[i]=a[n+i]=gn(); for(int chino=1;chino<=n;chino++){ memset(f,0x80,sizeof(f)); memset(g,0x7f,sizeof(g)); for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i], f[i][1]=mod(s[i]), g[i][1]=mod(s[i]); for(int i=1;i<=n;i++) for(int j=2;j<=m;j++) for(int k=j-1;k<i;k++){ f[i][j]=max(f[i][j],f[k][j-1]*mod(s[i]-s[k])); g[i][j]=min(g[i][j],g[k][j-1]*mod(s[i]-s[k])); } mx=max(mx,f[n][m]); mn=min(mn,g[n][m]); int cocoa=a[n]; for(int i=n;i;i--) a[i]=a[i-1]; a[1]=cocoa; //交错一下数组 } printf("%d\n%d",mn,mx);}
其实非常水,但是我还是因为种种细节改了一天,(比如改数组的时候把a[1]打成a[n]什么的…)
2.SPOJ_AIBOHP
SPOJ有些神题…
认识了一个新单词:aibohphobia 回文恐惧症(并无卵用)
题意:给一个串,要添加一些字符变成回文,求最少需要添加的字符数…
Emmmm就比较简单了……答案就是(x的长度)减去(x与x倒置求lcs的长度)……
其中lcs用
lcs指的是最长公共子序列,不必连续的那种,不要像我一样误会了~
推lcs的式子:
状态转移方程:
代码:
#include <string>#include <cstring>#include <iostream>using namespace std;int f[6310][6310];char c[6310],r[6310];inline int max(const int &a,const int &b){ if(a>b) return a; return b;}int main(){ int t; scanf("%d\n",&t); while(t--){ scanf("%s",c); int n=strlen(c); for(int i=0;i<n;i++) r[i]=c[n-i-1]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(c[i-1]==r[j-1]) f[i][j]=f[i-1][j-1]+1; else f[i][j]=max(f[i-1][j],f[i][j-1]); printf("%d\n",n-f[n][n]); }}
3.SPOJ_CODERE3
题目大意:经典题目:合唱队形
把出队人数改成队伍的人数即可…(其实是一回事,毕竟就是拿n一减嘛= =)
就是
状态转移方程直接看代码吧OvO
#include <cstdio>int f[1010],g[1010],a[1010];inline int gn(){ int a=0;char c=getchar();bool f=0; for(;(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-') f=1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) a=(a<<1)+(a<<3)+c-'0'; if(f) return -a; return a;}int main(){ int T=gn(); while(T--){ int n=gn(); for(int i=1;i<=n;i++) a[i]=gn(),f[i]=g[i]=1; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) if(a[i]<a[j]&&f[j]<f[i]+1) f[j]=f[i]+1; //正向的LIS for(int i=n;i>=1;i--) for(int j=n;j>=i;j--) if(a[i]>a[j]&&g[i]<g[j]+1) g[i]=g[j]+1; //反向的LIS int ans=0; for(int i=1;i<=n;i++) if(f[i]+g[i]-1>ans) ans=f[i]+g[i]-1; printf("%d\n",ans); }}
4.luogu2721小Q的赚钱计划
这题本来想专门开一篇讲的,但是个人认为还是比较水的,就扔在这里了= =
lhr dalao又在luogu随机跳题虐场了……先%%%dalao
然后跳到一道题就来忽悠我做……
我一看是难度NOI/NOI+/CTSC突然有一种想打死他的冲动→_→
经过了思索(因为这题没有题解嘛= =),觉得这题好像不是太难…
然后:这道题我1A了!!!!!!!!!!!!!!!!!!(兴高采烈状)
所以说评级为什么是”NOI/NOI+/CTSC”……
明明很水一道dp嘛= =
题目给的是年利率, 所以要换算, 当然只要玩懂样例就明白了~
这题给我的第一反应是会场安排……
然后想写一个
本来以为先将产品的时间按左端点排序,然后每次枚举前面的转移就行了,然后发现转移不过去…
于是想再开一维去存上次转移了哪个产品,然后10000*10000的数组怎么可能开得开嘛= =
所以这样做是不行滴(那你写这么多干啥←_←)
我们可以看到,虽然n是比较大的,但是只求一年后的结果,而且都是以天(s)为单位变化的,所以我们可以根据时间d(di)p(tui)
我们把每个区间画出来,然后发现可以通过玄学方式转移= =
用
能写出一个状态转移方程(递推式):
然后就可以做了,当然我们在此之前要对输入的数据做一下处理……具体的流程还是写在代码里吧……
#include <cstdio>double f[366];//预处理出每个月1号之前有多少天(主要是因为懒)const int day[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};//表示每个产品的开始日期,结束日期和收益(x=1+k%)struct pro{int l,r; double x;}p[10101];inline int gn(){ int a=0;char c=getchar();for(;c<'0'||c>'9';c=getchar()); for(;c>='0'&&c<='9';c=getchar()) a=(a<<1)+(a<<3)+c-'0'; return a;}inline double max(const double &a,const double &b){if(a>b) return a;return b;}inline double min(const double &a,const double &b){if(a<b) return a;return b;}int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ int ti=gn(),len=gn(); double x; scanf("%lf",&x); p[i].l=day[ti/100]+ti%100; p[i].r=p[i].l+len-1; //处理第i项产品周期的左右端点 p[i].x=1.0+0.01*x*(len/365.0); //题目中说的是年利率,所以要这样处理.. } f[0]=1; for(int i=1;i<=365;i++){ f[i]=f[i-1]; for(int j=1;j<=n;j++) if(p[j].r==i) f[i]=max(f[i],f[p[j].l-1]*p[j].x); } printf("%.2lf",f[365]*1e5); //原来有10W}
反正就这样吧,以后我就可以吹我不到20min A掉一道NOI/NOI+/CTSC的题了......
- 【学术篇】一些水的不行的dp
- 一些免费的学术电子资源搜索引擎
- 研究生常用的一些学术搜索引擎
- 一些好的学术文章链接
- 推荐一些高质量的信息领域的学术资源库
- 介绍一些免费的学术电子资源搜索引擎
- 推荐一些常用的中外学术文献数据库网站
- 荐一些常用的中外学术文献数据库网站
- 推荐一些常用的中外学术文献数据库网站
- 我收集的一些学术资源(持续更新)
- 【学术篇】SDOI2008 沙拉公主的困惑
- 常用的学术搜索引擎
- 哈佛的学术精神
- 常用的学术搜索引擎
- 学术开始的地方
- google学术的域名
- 上谷歌学术的方法
- 好的学术网站
- java---InputOutputStream
- 《程序设计入门—Java语言.翁恺》第三周编程作业(1)-奇偶个数
- Recovery启动流程(1)--- 应用层到开机进入recovery详解
- 菱形
- Fair Game
- 【学术篇】一些水的不行的dp
- Linux下简单的mount命令实现(自动识别文件系统类型)
- 51nod 1290 Counting Diff Pairs(莫队+树状数组)
- WebGL快速入门及实例(一)
- golang笔记:游戏中排行榜的实现
- java---Buffered
- ISO/IEC 14496 文档内容 简介
- css3基础
- 如何学习spring入门知识点.