最近做了几道非常水非常水的dp......

之后刷的一些水dp也会写在这里......

此篇题目难度不递增!!!

Emmmm.......

1.luogu1043数字游戏

以前看过这个题几遍,没做这个题(觉得太难了)......

就是一道环形的区间dp......本来想按常规的思路拆成2n做,但是换算坐标好麻烦,

然后一看n,m好小于是就直接强行把数组错位做了......

设\(f[i][j]\)为前i个点分j份能得到的最大值,\(g[i][j]\)为前i个分j份能得到的最小值,

用\(mod(x)\)表示题目中所述的,x对10取模的结果...即

inline int mod(const int &t){return (x%10+10)%10;} //题目说过都是模数都是正数所以就是介个意思..

状态转移方程:

\(f[i][j]=max\{f[k][j-1]+\sum_{k+1}^{i}a_i\},k=[j-1,i)\)

\(g[i][j]=min\{g[k][j-1]+\sum_{k+1}^{i}a_i\},k=[j-1,i)\)

就是枚举k,然后让k之前的分j-1份,k+1..i分第j份,然后算就行了...

时间复杂度\(O(n^2*m)\)

代码(贴不贴的吧,有些变量名什么的都是细节啦):

#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用\(O(n^2)\)的就行了......至于为什么自己推一下,也不是很难...

lcs指的是最长公共子序列,不必连续的那种,不要像我一样误会了~

推lcs的式子:\(f[i][j]\)表示串c1前i个字符与串c2前j个字符的lcs长度

状态转移方程:$$

f[i][j]=\left{

\begin{aligned}

f[i-1][j-1]+1,c1[i]==c2[j] \

max(f[i-1][j],f[i][j-1]),c1[i]!=c2[j]

\end{aligned}

\right.

\[代码:
```cpp
#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](http://www.spoj.com/problems/CODERE3/)
题目大意:[经典题目:合唱队形](https://www.luogu.org/problem/show?pid=1091)
把出队人数改成队伍的人数即可...(其实是一回事,毕竟就是拿n一减嘛= =)
就是$O(n^2)$先从前往后推出到i为止的最长上升子序列,然后再从后往前推出到i为止的最长上升子序列(当然是从后数) 这个地方能不能用$O(nlogn)$我就不知道了,好像是不行的...或者是我太弱了...
状态转移方程直接看代码吧OvO
```cpp
#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的赚钱计划](https://www.luogu.org/problem/show?pid=2721)
这题本来想专门开一篇讲的,但是个人认为还是比较水的,就扔在这里了= =

lhr dalao又在luogu随机跳题虐场了......先%%%dalao
然后跳到一道题就来忽悠我做......
我一看是难度NOI/NOI+/CTSC突然有一种想打死他的冲动→_→
经过了思索~~(因为这题没有题解嘛= =)~~,觉得这题好像不是太难...

然后:这道题我1A了!!!!!!!!!!!!!!!!!!(兴高采烈状)
所以说评级为什么是"NOI/NOI+/CTSC"......
明明很水一道dp嘛= =

*题目给的是年利率, 所以要换算, 当然只要玩懂样例就明白了~*

这题给我的第一反应是会场安排......
然后想写一个$O(n^2)$的dp, 觉得n<=10000的话应该能卡过orz...(你哪里来的自信啊喂←_←)
本来以为先将产品的时间按左端点排序,然后每次枚举前面的转移就行了,然后发现转移不过去...
于是想再开一维去存上次转移了哪个产品,然后10000*10000的数组怎么可能开得开嘛= =

所以这样做是不行滴(那你写这么多干啥←_←)

我们可以看到,虽然n是比较大的,但是只求一年后的结果,而且都是以天(s)为单位变化的,所以我们可以根据时间d(di)p(tui)

我们把每个区间画出来,然后发现可以通过玄学方式转移= =
用$f[i]$表示i天后的最大收益...
能写出一个状态转移方程~~(递推式)~~:
$f[i]=f[i-1];$
$f[i]=max\{f[i],f[j]*a_j\} (i=r_j,j=1..n)$//$r_j$表示第j项产品周期的右端点,$a_j$表示第j项产品的收益.

然后就可以做了,当然我们在此之前要对输入的数据做一下处理......具体的流程还是写在代码里吧......
```cpp
#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的更多相关文章

  1. 【学术篇】CF833B TheBakery 分治dp+主席树

    题目の传送门~ 题目大意: 将\(n\)个蛋糕分成恰好\(k\)份, 求每份中包含的蛋糕的种类数之和的最大值. 这题有两种做法. 第一种是线段树优化dp, 我还没有考虑. 另一种就是分治+主席树. 然 ...

  2. 【学术篇】CF935E Fafa and Ancient Mathematics 树形dp

    前言 这是一道cf的比赛题.. 比赛的时候C题因为自己加了一个很显然不对的特判WA了7次但找不出原因就弃疗了... 然后就想划水, 但是只做了AB又不太好... 估计rating会掉惨 (然而事实证明 ...

  3. 2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

    听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到10 ...

  4. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  5. Codeforces Round #301 (Div. 2)A B C D 水 模拟 bfs 概率dp

    A. Combination Lock time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. LightOJ 1248 Dice (III) (水题,期望DP)

    题意:给出一个n面的色子,问看到每个面的投掷次数期望是多少. 析:这个题很水啊,就是他解释样例解释的太...我鄙视他,,,,, dp[i] 表示 已经看到 i 面的期望是多少,然后两种选择一种是看到新 ...

  7. nyoj 1208——水题系列——————【dp】

    水题系列 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述     给你一个有向图,每条边都有一定的权值,现在让你从图中的任意一点出发,每次走的边的权值必须必上一次的权 ...

  8. 【学术篇】51nod 1238 最小公倍数之和

    这是一道杜教筛的入(du)门(liu)题目... 题目大意 求 \[ \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) \] 一看就是辣鸡反演一类的题目, 那就化式子呗.. \[ \s ...

  9. 【学术篇】NOIP2016 D1T3 luogu1850换教室

    题目链接:点击这里献出你宝贵的时间(是用来做题不是捐赠Emmmm).. Emmmm我太弱了= = 做完这题我觉得我应该去打星际..这题怎么就有重边了呢.. 这题就是一道期望= =当时考场上好像完全不会 ...

随机推荐

  1. [已解决]报错:ValueError: Expected 2D array, got scalar array instead

    报错代码: new_x = 84610 pre_y = model.predict(new_x) print(pre_y) 报错结果: ValueError: Expected 2D array, g ...

  2. man bash

    BASH(1) General Commands Manual BASH(1) NAME bash - GNU Bourne-Again SHell SYNOPSIS bash [options] [ ...

  3. pytest--两个fixture时,灵活运用

    import pytest@pytest.fixture()def login_r(open_browser): print('登陆') @pytest.fixture()def open_brows ...

  4. yum处理损坏的包依赖关系

    有时在安装多个软件包时,某个包的软件依赖关系可能会被另外一个包的安装覆盖掉.这叫做损坏的包依赖关系(broken dependency). 如果系统出现问题,可以先尝试: yum clean all ...

  5. jquery获取select选中项 自定义属性的值

    <select id="serialNo" > <option value=''1' data-id="001">第一次</opt ...

  6. javascript--判断语句

    1.if...else.. if(m===1){ console.log('1') }else{ console.log('X') } 一般if 里面采用类型全等的运算符. 2.switch var ...

  7. 数位dp——牛客多校H

    /* x[1,A] y[1,B] x^y<C 或 x&y>C 把ABC拆成二进制后按位进行数位dp dp[pos][s1][s2][f1][f2] 表示从高到低第pos位,条件一状 ...

  8. docker快速安装elasticsearch

    一.选择版本,拉取镜像 docker pull elasticsearch:5.6.9 #不选择版本就是最新的 二.运行设置容器 # -d 表示在后台运行 docker run -d -p 9200: ...

  9. NX二次开发-清除信息窗口中的内容,退出信息窗口UF_UI_exit_listing_window

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //打开信息窗口 UF_UI_open_listing_window() ...

  10. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById 1.返回顶部 1. templateMessage.getTem ...