写了两天的dp题,表示大多dp都不会啊,还是爆搜大法好。我真的太蒻了dp还是要多做题啊,一些基本的套路还是不熟,真正写对的dp也就一道,还一道爆搜过的,dp还有很深的坑要填啊。。

8.8

T1 质数和式

题意

大概就是给出一个数n,用质数将它表示按字典序由大到小排序,输出排列为k的质数和式

解析



代码(咕咕)

T2 终极简单问题

假的终极简单

解析

挂上学长的题解

代码(继续咕咕)

T3 分宝藏

题意



一道比较有趣的题,等有时间写吧。

代码(继续吧)

T4 取数字问题

题意

sb题目,不多说,爆搜就能过。

代码(这个总算没咕咕)

#include<bits/stdc++.h>
using namespace std;
int n,m,ans=1<<30,a[15][15];
void dfs(int x,int y,int data){
if(x==n&&y==m){
if(data>0){
ans=min(ans,data);
return;
}
}
if(x+1<=n&&y<=m) dfs(x+1,y,data+a[x+1][y]);
if(x<=n&&y+1<=m) dfs(x,y+1,data+a[x][y+1]);
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%d",&a[i][j]);
}
}
dfs(1,1,a[1][1]);
if(ans==(1<<30)) printf("-1");
else printf("%d",ans);
return 0;
}

正解据说是这样的

T5 求三角形最大的面积

题意





爆搜拿了40多分。。。

解析

代码(马上就补)

8.9

T1 可怜的绵羊

题意





一道比较神仙的题目,做法看解析吧,考场输出die个get 13 point

代码(还毛写,先放std)

#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define maxn 101 struct point {
long long x,y;
};
long long n,m=0;
//凸多边形顶点坐标和内部点的坐标
point vertex[maxn],insd[maxn];
//检查点是否在多边形边上
int out[maxn][maxn],online[maxn][maxn]; //默认的abs函数是对整数取绝对值
long long abs(long long x){
return x<0 ? -x : x;
} //返回三角形abc面积的两倍
long long area(point a,point b,point c){
return abs(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y));
} //向量oa叉乘向量ob
//大于0,这三个点是逆时针;小于0,这三个点是顺时针
long long multiple(point a,point b,point o){
return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x);
} void prepare(){
long i,j,k,tmp;
memset(out,0,sizeof(out));
memset(online,0,sizeof(online));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i!=j)
for (k=1;k<=m;k++){
tmp=multiple(insd[k],vertex[j],vertex[i]);
if (tmp>=0) out[i][j]++; //判断是否在逆时针方向
if (tmp==0) online[i][j]=1;
}
} void dp(){
long long u,i,j;
long long a[maxn],tmp,max=0;
//枚举点u,并求出最大值
for (u=1;u<=n-2;u++){
memset(a,0,sizeof(a));
for (i=u+1;i<=n-1;i++)
for (j=i+1;j<=n;j++)
//判断三角形内是否有点
if (out[u][i]+out[i][j]+out[j][u]==m) {
//更新a[j]的值,取最大值
tmp=area(vertex[u],vertex[i],vertex[j]);
if (tmp>a[j]) a[j]=tmp;
if (online[u][i]==0) {
tmp+=a[i];
if (tmp>a[j]) a[j]=tmp;
}
}
for (j=u+2;j<=n;j++)
if (a[j]>max) max=a[j];
}
if (max==0) printf("die\n");
else printf("%.2f\n",max/2.);
} int main(){
scanf("%lld",&n);
long i,j,tm,s1=0,s2;
for (i=1;i<=n;i++)
scanf("%lld%lld",&vertex[i].x,&vertex[i].y);
//求总面积
for (i=2;i<n;i++)
s1+=area(vertex[1],vertex[i],vertex[i+1]);
scanf("%lld",&tm);
for (i=1;i<=tm;i++){
scanf("%lld%lld",&insd[0].x,&insd[0].y);
s2=0;
for (j=1;j<=n;j++)
s2+=area(insd[0],vertex[j],vertex[j%n+1]);
//利用面积判断点是否在多边形内部
if (s1==s2) insd[++m]=insd[0];
}
prepare();
dp();
return 0;
}

T2 不老的传说

题意



类似于涂色问题,环形问题不多说,断环加倍即可,限制条件if判断就行。终于ac了一道题。。

解析



代码

#include<bits/stdc++.h>
using namespace std;
int n,c,p,a[410];
int f[410][410],ans=1<<30;
int main(){
scanf("%d %d %d",&n,&c,&p);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
a[i+n]=a[i];
}
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;++i){
f[i][i]=f[i+n][i+n]=1;
}
for(int l=2;l<=n;++l){
for(int i=1;i<=2*n-l+1;++i){
int j=i+l-1;
if(a[i]==a[j]&&l<=p) f[i][j]=min(f[i+1][j],f[i][j-1]);
else {
for(int k=i;k<j;++k){
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
}
}
for(int i=1;i<=n;++i){
if(f[i][i+n-1]){
ans=min(ans,f[i][i+n-1]);
}
}
printf("%d",ans);
return 0;
}
/*
5 2 3
1 2 1 2 1
*/

T3 数字游戏

题意

话说考场dfs骗了30分,一开始想的距离正解差一点啊,贪心加dp就可以过的水题,真正太蒻了

解析

代码

#include<bits/stdc++.h>
using namespace std;
struct node{
int x;
int y;
}a[210];
int m,n,k;
int f[210][210];
bool book[210];
long long ans;
bool cmp(node a,node b){
return a.y>b.y;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i].x);
}
for(int i=1;i<=n;++i){
scanf("%d",&a[i].y);
}
sort(a+1,a+1+n,cmp);
f[0][0]=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i].x-a[i].y*(j-1));
}
}
printf("%lld",f[n][m]);
return 0;
}

T4 多米诺骨牌问题

题意

类似于就是背包,考场竟然没想到,打了个爆搜骗了25。

解析

代码

跟解析有点不一样v[i]价值,w[i]重量,s背包容积,背包转移即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
int n,s,x,y,tot,ans;
int v[maxn],w[maxn],dp[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d %d",&x,&y);
if(x>y){
s+=x-y;
v[i]=2*(x-y);
w[i]=1;
}
else{
s+=y-x;
v[i]=2*(y-x);
w[i]=-1;
tot++;
}
}
for(int i=1;i<=s;++i) dp[i]=maxn;
dp[0]=0;
for(int i=1;i<=n;++i){
for(int j=s;j>=v[i];--j){
if(dp[j-v[i]]!=maxn){
dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
}
}
}
for(int i=s;i>=0;--i){
if(dp[i]!=maxn){
ans=dp[i];
break;
}
}
printf("%d",ans+tot);
return 0;
}
/*
4
6 1
1 5
1 3
1 2
*/

T5 下楼问题

题意



大概就是每一楼有3个门问走到第一楼的最长时间

一道比较简单的dp题,考场看到是英文题便放弃了

代码(以后再说吧)

T6 瞬移

题意



同上

解析



代码(std)

#include <stdio.h>
#include <stdlib.h>
#include <map> const int maxn = 1000;
const int maxm = 12; typedef std::map<std::pair<int, int>, int>::iterator Iter;
std::map<std::pair<int, int>, int> ans[maxn];
int tc, tt, n, m, ma, mi, x, y, bans;
char a[maxn][maxm]; int main ()
{
freopen("teleportation.in", "r", stdin);
freopen("teleportation.out", "w", stdout);
scanf ("%d", &tc);
for (int tt = 0; tt < tc; tt++)
{
scanf ("%d%d%d%d%d%d", &n, &m, &mi, &ma, &x, &y);
for (int i = 0; i < n; i++)
{
scanf ("%s", a[i]);
// printf ("%s\n", a[i]);
}
ans[0].clear ();
std::pair<int, int> p = std::make_pair<int, int> (x, y);
ans[0][p] = 0;
for (int i = 1; i < n; i++)
{
ans[i].clear ();
for (int j = 0; j < m; j++)
{
if (a[i][j] == '*')
{
for (int k = j + mi; k <= j + ma && k < m; k++)
{
//printf ("--%d: [%d, %d]\n", i, j, k);
if (a[i][k] == '*')
{
p = std::make_pair<int, int> (j, k);
for (Iter it = ans[i - 1].begin (); it != ans[i - 1].end (); ++it)
{
int c = it->second + abs (it->first.first - j) + abs (it->first.second - k);
if (ans[i].find (p) == ans[i].end () || ans[i][p] > c)
ans[i][p] = c;
}
// printf ("%d: [%d, %d]:%d\n", i, j, k, ans[i][p]);
}
}
}
}
}
bans = -1;
for (Iter it = ans[n - 1].begin (); it != ans[n - 1].end (); ++it)
{
if (bans == -1 || it->second < bans)
{
// printf ("[%d, %d]:%d\n", it->first.first, it->first.second, it->second);
bans = it->second;
}
}
printf ("%d\n", bans);
}
return bans >= 0;
}

T7 护士工作安排问题

题意



一道比较好想不好写的题目

解析

代码(std)

#include<stdio.h>
#include<string.h> const int N = 20;
const int DAY = 5;
const int PAT = 1 << DAY; int n;
int love[N][PAT];
int req[DAY];
int memo[N][N/2+1][N/2+1][N/2+1][N/2+1][N/2+1];
int bit[PAT][DAY];
int changed[DAY]; void preprocess() {
for (int i = 0; i < PAT; i++) {
int k = i;
for (int j = 0; j < DAY; j++) {
bit[i][DAY - 1 - j] = k & 1;
k >>= 1;
}
}
}
inline int getDec(int r0, int r1, int r2, int r3, int r4) {
return (((((((r0 << 1) | r1) << 1) | r2) << 1) | r3) << 1) | r4;
}
void input() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < PAT; j++) {
scanf("%d", &love[i][j]);
}
}
for (int i = 0; i < DAY; i++) {
scanf("%d", &req[i]);
}
}
int dp(int p, int r0, int r1, int r2, int r3, int r4) {
if (memo[p][r0][r1][r2][r3][r4] != -1) return memo[p][r0][r1][r2][r3][r4];
if (p == 0) {
return memo[p][r0][r1][r2][r3][r4] = love[0][getDec(changed[0] ^ r0,
changed[1] ^ r1, changed[2] ^ r2, changed[3] ^ r3, changed[4] ^ r4)];
}
int ret = 0;
for (int i = 0; i < PAT; i++) {
int rr0 = r0 - (bit[i][0] ^ changed[0]);
int rr1 = r1 - (bit[i][1] ^ changed[1]);
int rr2 = r2 - (bit[i][2] ^ changed[2]);
int rr3 = r3 - (bit[i][3] ^ changed[3]);
int rr4 = r4 - (bit[i][4] ^ changed[4]);
if (rr0 >= 0 && rr0 <= p && rr1 >= 0 && rr1 <= p
&& rr2 >= 0 && rr2 <= p && rr3 >= 0 && rr3 <= p
&& rr4 >= 0 && rr4 <= p) {
int t = dp(p - 1, rr0, rr1, rr2, rr3, rr4) + love[p][i];
if (t > ret) ret = t;
}
}
return memo[p][r0][r1][r2][r3][r4] = ret;
}
void solve() {
for (int i = 0; i < DAY; i++) {
if (req[i] + req[i] > n) {
req[i] = n - req[i];
changed[i] = 1;
} else {
changed[i] = 0;
}
}
memset(memo, -1, sizeof(memo));
printf("%d\n", dp(n - 1, req[0], req[1], req[2], req[3], req[4]));
}
int main() {
freopen("nurse.in", "r", stdin);
freopen("nurse.out", "w", stdout);
preprocess();
int T;
scanf("%d", &T);
while (T--) {
input();
solve();
}
//while (1);
return 0;
}

T8 循环小数

题意



给出循环节求分数表达,一道小学数学问题,考场不会写。。

解析

A=b+a(10^m-1)

B=10(n+m)-10n

再约分输出A,B即可。

证明自行百度

代码()

8.8&8.9 dp训练小结的更多相关文章

  1. [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10

    [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...

  2. 插头$DP$学习小结

    插头\(DP\)学习小结 这种辣鸡毒瘤东西也能叫算法... 很优秀的一个算法. 最基本的适用范围主要是数据范围极小的网格图路径计数问题. 如果是像\(Noi2018\)那种的话建议考生在其他两道题难度 ...

  3. 20220729 - DP训练 #2

    20220729 - DP训练 #2 时间记录 \(8:00-8:10\) 浏览题面 \(8:10-8:50\) T1 看题想到了建树,从每一个点遍历,若能遍历每一个点,则可以获胜 快速写完之后,发现 ...

  4. 20220728 - DP训练 #1

    20220728 - DP训练 #1 时间记录 \(8:00-9:00\) T1 尝试做 \(T1\),可惜并未做出,没有想到是资源分配 设置三维状态,初值一直不知道怎么设置 并且对于距离有一部分不会 ...

  5. 树形动态规划(树状DP)小结

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  6. ACM训练小结-2018年6月14日

    于恢复性训练Day2情况如下:https://vjudge.net/contest/234651    先看A题,读懂题意,没有想明白,码完后连续多次WA,后找到错误AC.    对B题,发现其是一个 ...

  7. opencv人脸检测分类器训练小结

    这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...

  8. [DP] LCS小结

    额..失误.. LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. DP.O ...

  9. 数位DP复习小结

    转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8490222.html 之前学数位dp的时候底子没打扎实 虚的要死 这次正好有时间……刷了刷之前没做的题目 感觉自 ...

随机推荐

  1. windows server 2008 R2中建立ftp站点

    在windows server 2008 R2中建立ftp站点,要遵循以下步骤: (1) 开启IIS中的ftp服务: (2) 在IIS中建立ftp站点. 具体过程如下: (1) 开启IIS中的ftp服 ...

  2. Drawable 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android Drawable 是Android 中图像显示的常用方法. 概念:Drawable ...

  3. 二叉查找树(查找、插入、删除)——C语言

    二叉查找树 二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率.二叉查找树有以下性质: (1)若左子树不空,则左子树上所有节点的值均小于它的根节 ...

  4. Hadoop学习(8)-scala环境配置及简单使用

    学习scala的原因主要是因为以后要学习spark. scala是运行在java虚拟机上的,它是一种面向对象和函数式编程结合的语言,并兼容java程序 相对于java更简单 安装scala前提你要保证 ...

  5. centos部署oracle rac单实例11.2.0.3数据库(使用asm磁盘)

    部署oracle rac单实例数据库,需要安装grid和datavase两部分,所以首先创建两个用户oracle和grid,因为不能使用root用户进行安装,在安装之前首先需要修改一些系统参数和安装一 ...

  6. DT-06 For AT

    乐鑫官方AT指令固件- 最新1.5.4版本 此固件仅支持AT指令对模块进行操作. 1.DT-06固件的烧录 1.1打开ESP模块下载工具ESPFlashDownloadTool,选择需要下载的固件,填 ...

  7. scrapy xpath用法

    一.实验环境 1.Windows7x64_SP1 2.anaconda3 + python3.7.3(anaconda集成,不需单独安装) 3.scrapy1.6.0 二.用法举例 1.开启scrap ...

  8. ggplot2: how to check the color and coreponding value pairs

    The way to check the color and coreponding value pairs in ggplot2 To see what colors are used to mak ...

  9. net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1

    目录 前言 拦截器 异常拦截器 测试结果 身份验证拦截器 测试 小结 补充 2019-07-31 前言 一天天不知道怎么过的,但确实挺忙,事赶事不带停那种,让我感觉跟在流水线干活一样,忙活的事差不多了 ...

  10. node爬虫的几种简易实现方式

    说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 s ...