最近做了几道非常水非常水的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. mysql shell脚本

    mysql shell连接脚本 本地连接及远程链接 #!/bin/bash #连接MySQL数据库 Host=127.0.0.1 User=username PASSWORD=password POR ...

  2. leetcode.哈希表.594最长和谐子序列-Java

    1. 具体题目: 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1.现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5 ...

  3. 屏幕操作录制成gif图的技巧

    我呢,在记录一些做过得实例的时候,总需要上一两张效果图,截静态图太浪费时间了,于是就找了一些录制git图的软件 一.Gif动画录制工具 这是我在360软件中心下载的,用了一下,不好用,录制出来的图是黑 ...

  4. str2int HDU - 4436 后缀自动机求子串信息

    题意: 给出 n 个串,求出这 n 个串所有子串代表的数字的和. 题解; 首先可以把这些串构建后缀自动机(sam.last=1就好了), 因为后缀自动机上从 root走到的任意节点都是一个子串,所有可 ...

  5. Unicode - 16 位统一超级字符集

    描述 (DESCRIPTION) 国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 包含所有别的字符集标准里的字符,并且保证了 ...

  6. Arrays 001

    1.1 Array Initalization First of all, we need know Java arrays is static. When the array is initiali ...

  7. tomcat+apache+jk

    安装JDK下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html安装 rpm ...

  8. pandas-索引

    一.按列取.按索引/行取.按特定行取 import numpy as np from pandas import DataFrame import pandas as pd df=DataFrame( ...

  9. EasyUI - 简介

    1. EasyUI : 简单的界面设计框架, 基于jQuery的UI插件, 主要用来设计网站的后台管理系统 2. EasyUI使用 : 将EasyUI提供的js文件和主题(themes)样式存放到项目 ...

  10. wordpress添加视频弹窗插件Video PopUp

    Video PopUp 给外部div 添加class类名:class="main-play" a链接添加  class="vp-a" 测试链接地址:https: ...