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

8.8

T1 质数和式

题意

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

解析



代码(咕咕)

T2 终极简单问题

假的终极简单

解析

挂上学长的题解

代码(继续咕咕)

T3 分宝藏

题意



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

代码(继续吧)

T4 取数字问题

题意

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

代码(这个总算没咕咕)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,ans=1<<30,a[15][15];
  4. void dfs(int x,int y,int data){
  5. if(x==n&&y==m){
  6. if(data>0){
  7. ans=min(ans,data);
  8. return;
  9. }
  10. }
  11. if(x+1<=n&&y<=m) dfs(x+1,y,data+a[x+1][y]);
  12. if(x<=n&&y+1<=m) dfs(x,y+1,data+a[x][y+1]);
  13. }
  14. int main(){
  15. scanf("%d %d",&n,&m);
  16. for(int i=1;i<=n;++i){
  17. for(int j=1;j<=m;++j){
  18. scanf("%d",&a[i][j]);
  19. }
  20. }
  21. dfs(1,1,a[1][1]);
  22. if(ans==(1<<30)) printf("-1");
  23. else printf("%d",ans);
  24. return 0;
  25. }

正解据说是这样的

T5 求三角形最大的面积

题意





爆搜拿了40多分。。。

解析

代码(马上就补)

8.9

T1 可怜的绵羊

题意





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

代码(还毛写,先放std)

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. using namespace std;
  5. #define maxn 101
  6. struct point {
  7. long long x,y;
  8. };
  9. long long n,m=0;
  10. //凸多边形顶点坐标和内部点的坐标
  11. point vertex[maxn],insd[maxn];
  12. //检查点是否在多边形边上
  13. int out[maxn][maxn],online[maxn][maxn];
  14. //默认的abs函数是对整数取绝对值
  15. long long abs(long long x){
  16. return x<0 ? -x : x;
  17. }
  18. //返回三角形abc面积的两倍
  19. long long area(point a,point b,point c){
  20. return abs(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y));
  21. }
  22. //向量oa叉乘向量ob
  23. //大于0,这三个点是逆时针;小于0,这三个点是顺时针
  24. long long multiple(point a,point b,point o){
  25. return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x);
  26. }
  27. void prepare(){
  28. long i,j,k,tmp;
  29. memset(out,0,sizeof(out));
  30. memset(online,0,sizeof(online));
  31. for (i=1;i<=n;i++)
  32. for (j=1;j<=n;j++)
  33. if (i!=j)
  34. for (k=1;k<=m;k++){
  35. tmp=multiple(insd[k],vertex[j],vertex[i]);
  36. if (tmp>=0) out[i][j]++; //判断是否在逆时针方向
  37. if (tmp==0) online[i][j]=1;
  38. }
  39. }
  40. void dp(){
  41. long long u,i,j;
  42. long long a[maxn],tmp,max=0;
  43. //枚举点u,并求出最大值
  44. for (u=1;u<=n-2;u++){
  45. memset(a,0,sizeof(a));
  46. for (i=u+1;i<=n-1;i++)
  47. for (j=i+1;j<=n;j++)
  48. //判断三角形内是否有点
  49. if (out[u][i]+out[i][j]+out[j][u]==m) {
  50. //更新a[j]的值,取最大值
  51. tmp=area(vertex[u],vertex[i],vertex[j]);
  52. if (tmp>a[j]) a[j]=tmp;
  53. if (online[u][i]==0) {
  54. tmp+=a[i];
  55. if (tmp>a[j]) a[j]=tmp;
  56. }
  57. }
  58. for (j=u+2;j<=n;j++)
  59. if (a[j]>max) max=a[j];
  60. }
  61. if (max==0) printf("die\n");
  62. else printf("%.2f\n",max/2.);
  63. }
  64. int main(){
  65. scanf("%lld",&n);
  66. long i,j,tm,s1=0,s2;
  67. for (i=1;i<=n;i++)
  68. scanf("%lld%lld",&vertex[i].x,&vertex[i].y);
  69. //求总面积
  70. for (i=2;i<n;i++)
  71. s1+=area(vertex[1],vertex[i],vertex[i+1]);
  72. scanf("%lld",&tm);
  73. for (i=1;i<=tm;i++){
  74. scanf("%lld%lld",&insd[0].x,&insd[0].y);
  75. s2=0;
  76. for (j=1;j<=n;j++)
  77. s2+=area(insd[0],vertex[j],vertex[j%n+1]);
  78. //利用面积判断点是否在多边形内部
  79. if (s1==s2) insd[++m]=insd[0];
  80. }
  81. prepare();
  82. dp();
  83. return 0;
  84. }

T2 不老的传说

题意



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

解析



代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,c,p,a[410];
  4. int f[410][410],ans=1<<30;
  5. int main(){
  6. scanf("%d %d %d",&n,&c,&p);
  7. for(int i=1;i<=n;++i){
  8. scanf("%d",&a[i]);
  9. a[i+n]=a[i];
  10. }
  11. memset(f,0x3f,sizeof(f));
  12. for(int i=1;i<=n;++i){
  13. f[i][i]=f[i+n][i+n]=1;
  14. }
  15. for(int l=2;l<=n;++l){
  16. for(int i=1;i<=2*n-l+1;++i){
  17. int j=i+l-1;
  18. if(a[i]==a[j]&&l<=p) f[i][j]=min(f[i+1][j],f[i][j-1]);
  19. else {
  20. for(int k=i;k<j;++k){
  21. f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
  22. }
  23. }
  24. }
  25. }
  26. for(int i=1;i<=n;++i){
  27. if(f[i][i+n-1]){
  28. ans=min(ans,f[i][i+n-1]);
  29. }
  30. }
  31. printf("%d",ans);
  32. return 0;
  33. }
  34. /*
  35. 5 2 3
  36. 1 2 1 2 1
  37. */

T3 数字游戏

题意

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

解析

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int x;
  5. int y;
  6. }a[210];
  7. int m,n,k;
  8. int f[210][210];
  9. bool book[210];
  10. long long ans;
  11. bool cmp(node a,node b){
  12. return a.y>b.y;
  13. }
  14. int main(){
  15. scanf("%d %d",&n,&m);
  16. for(int i=1;i<=n;++i){
  17. scanf("%d",&a[i].x);
  18. }
  19. for(int i=1;i<=n;++i){
  20. scanf("%d",&a[i].y);
  21. }
  22. sort(a+1,a+1+n,cmp);
  23. f[0][0]=0;
  24. for(int i=1;i<=n;++i){
  25. for(int j=1;j<=m;++j){
  26. f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i].x-a[i].y*(j-1));
  27. }
  28. }
  29. printf("%lld",f[n][m]);
  30. return 0;
  31. }

T4 多米诺骨牌问题

题意

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

解析

代码

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e4+5;
  4. int n,s,x,y,tot,ans;
  5. int v[maxn],w[maxn],dp[maxn];
  6. int main(){
  7. scanf("%d",&n);
  8. for(int i=1;i<=n;++i){
  9. scanf("%d %d",&x,&y);
  10. if(x>y){
  11. s+=x-y;
  12. v[i]=2*(x-y);
  13. w[i]=1;
  14. }
  15. else{
  16. s+=y-x;
  17. v[i]=2*(y-x);
  18. w[i]=-1;
  19. tot++;
  20. }
  21. }
  22. for(int i=1;i<=s;++i) dp[i]=maxn;
  23. dp[0]=0;
  24. for(int i=1;i<=n;++i){
  25. for(int j=s;j>=v[i];--j){
  26. if(dp[j-v[i]]!=maxn){
  27. dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
  28. }
  29. }
  30. }
  31. for(int i=s;i>=0;--i){
  32. if(dp[i]!=maxn){
  33. ans=dp[i];
  34. break;
  35. }
  36. }
  37. printf("%d",ans+tot);
  38. return 0;
  39. }
  40. /*
  41. 4
  42. 6 1
  43. 1 5
  44. 1 3
  45. 1 2
  46. */

T5 下楼问题

题意



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

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

代码(以后再说吧)

T6 瞬移

题意



同上

解析



代码(std)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <map>
  4. const int maxn = 1000;
  5. const int maxm = 12;
  6. typedef std::map<std::pair<int, int>, int>::iterator Iter;
  7. std::map<std::pair<int, int>, int> ans[maxn];
  8. int tc, tt, n, m, ma, mi, x, y, bans;
  9. char a[maxn][maxm];
  10. int main ()
  11. {
  12. freopen("teleportation.in", "r", stdin);
  13. freopen("teleportation.out", "w", stdout);
  14. scanf ("%d", &tc);
  15. for (int tt = 0; tt < tc; tt++)
  16. {
  17. scanf ("%d%d%d%d%d%d", &n, &m, &mi, &ma, &x, &y);
  18. for (int i = 0; i < n; i++)
  19. {
  20. scanf ("%s", a[i]);
  21. // printf ("%s\n", a[i]);
  22. }
  23. ans[0].clear ();
  24. std::pair<int, int> p = std::make_pair<int, int> (x, y);
  25. ans[0][p] = 0;
  26. for (int i = 1; i < n; i++)
  27. {
  28. ans[i].clear ();
  29. for (int j = 0; j < m; j++)
  30. {
  31. if (a[i][j] == '*')
  32. {
  33. for (int k = j + mi; k <= j + ma && k < m; k++)
  34. {
  35. //printf ("--%d: [%d, %d]\n", i, j, k);
  36. if (a[i][k] == '*')
  37. {
  38. p = std::make_pair<int, int> (j, k);
  39. for (Iter it = ans[i - 1].begin (); it != ans[i - 1].end (); ++it)
  40. {
  41. int c = it->second + abs (it->first.first - j) + abs (it->first.second - k);
  42. if (ans[i].find (p) == ans[i].end () || ans[i][p] > c)
  43. ans[i][p] = c;
  44. }
  45. // printf ("%d: [%d, %d]:%d\n", i, j, k, ans[i][p]);
  46. }
  47. }
  48. }
  49. }
  50. }
  51. bans = -1;
  52. for (Iter it = ans[n - 1].begin (); it != ans[n - 1].end (); ++it)
  53. {
  54. if (bans == -1 || it->second < bans)
  55. {
  56. // printf ("[%d, %d]:%d\n", it->first.first, it->first.second, it->second);
  57. bans = it->second;
  58. }
  59. }
  60. printf ("%d\n", bans);
  61. }
  62. return bans >= 0;
  63. }

T7 护士工作安排问题

题意



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

解析

代码(std)

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int N = 20;
  4. const int DAY = 5;
  5. const int PAT = 1 << DAY;
  6. int n;
  7. int love[N][PAT];
  8. int req[DAY];
  9. int memo[N][N/2+1][N/2+1][N/2+1][N/2+1][N/2+1];
  10. int bit[PAT][DAY];
  11. int changed[DAY];
  12. void preprocess() {
  13. for (int i = 0; i < PAT; i++) {
  14. int k = i;
  15. for (int j = 0; j < DAY; j++) {
  16. bit[i][DAY - 1 - j] = k & 1;
  17. k >>= 1;
  18. }
  19. }
  20. }
  21. inline int getDec(int r0, int r1, int r2, int r3, int r4) {
  22. return (((((((r0 << 1) | r1) << 1) | r2) << 1) | r3) << 1) | r4;
  23. }
  24. void input() {
  25. scanf("%d", &n);
  26. for (int i = 0; i < n; i++) {
  27. for (int j = 0; j < PAT; j++) {
  28. scanf("%d", &love[i][j]);
  29. }
  30. }
  31. for (int i = 0; i < DAY; i++) {
  32. scanf("%d", &req[i]);
  33. }
  34. }
  35. int dp(int p, int r0, int r1, int r2, int r3, int r4) {
  36. if (memo[p][r0][r1][r2][r3][r4] != -1) return memo[p][r0][r1][r2][r3][r4];
  37. if (p == 0) {
  38. return memo[p][r0][r1][r2][r3][r4] = love[0][getDec(changed[0] ^ r0,
  39. changed[1] ^ r1, changed[2] ^ r2, changed[3] ^ r3, changed[4] ^ r4)];
  40. }
  41. int ret = 0;
  42. for (int i = 0; i < PAT; i++) {
  43. int rr0 = r0 - (bit[i][0] ^ changed[0]);
  44. int rr1 = r1 - (bit[i][1] ^ changed[1]);
  45. int rr2 = r2 - (bit[i][2] ^ changed[2]);
  46. int rr3 = r3 - (bit[i][3] ^ changed[3]);
  47. int rr4 = r4 - (bit[i][4] ^ changed[4]);
  48. if (rr0 >= 0 && rr0 <= p && rr1 >= 0 && rr1 <= p
  49. && rr2 >= 0 && rr2 <= p && rr3 >= 0 && rr3 <= p
  50. && rr4 >= 0 && rr4 <= p) {
  51. int t = dp(p - 1, rr0, rr1, rr2, rr3, rr4) + love[p][i];
  52. if (t > ret) ret = t;
  53. }
  54. }
  55. return memo[p][r0][r1][r2][r3][r4] = ret;
  56. }
  57. void solve() {
  58. for (int i = 0; i < DAY; i++) {
  59. if (req[i] + req[i] > n) {
  60. req[i] = n - req[i];
  61. changed[i] = 1;
  62. } else {
  63. changed[i] = 0;
  64. }
  65. }
  66. memset(memo, -1, sizeof(memo));
  67. printf("%d\n", dp(n - 1, req[0], req[1], req[2], req[3], req[4]));
  68. }
  69. int main() {
  70. freopen("nurse.in", "r", stdin);
  71. freopen("nurse.out", "w", stdout);
  72. preprocess();
  73. int T;
  74. scanf("%d", &T);
  75. while (T--) {
  76. input();
  77. solve();
  78. }
  79. //while (1);
  80. return 0;
  81. }

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. Docker笔记(七):常用服务安装——Nginx、MySql、Redis

    开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的安装方法,一般都相对比较繁琐 —— 要经过下载软件或源码包,编译安装,配置,启动等步骤,使用 Docker ...

  2. Kubernetes Pod 驱逐详解

    原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...

  3. C++这么难,为什么还要学习C++呢?如何学?

    在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃. 这个世界本来就是残酷的,所以你不能怪C++向你展示了世界的本质 大 ...

  4. 趣味CSS3效果挑战小汇总

    众所周知,在CSS3中产生了诸多优秀的特性,现在就来分享一下我这段时间对于这些特性的效果实践,希望对大家有所启发. 挑战1: 画一个对话框 要画一个对话框,首先来学习做一个三角形.其实非常的简单. & ...

  5. JS判断字符串长度,结合element el-input el-form 表单验证(英文占1个字符,中文汉字占2个字符)

    首先看看判断字符串长度的几种方法(英文占1个字符,中文汉字占2个字符) 方法一: function strlen(str) { var len = 0; for (var i = 0; i < ...

  6. tensorflow学习笔记——图像数据处理

    喜欢摄影的盆友都知道图像的亮度,对比度等属性对图像的影响是非常大的,相同物体在不同亮度,对比度下差别非常大.然而在很多图像识别问题中,这些因素都不应该影响最后的结果.所以本文将学习如何对图像数据进行预 ...

  7. lumen错误 NotFoundHttpException in RoutesRequests.php line 442:

    解决:进入 public/index.PHP 将 $app->run(); 修改成下面的: $request = Illuminate\Http\Request::capture(); $app ...

  8. 访问CGI程序时不添加 /cgi-bin/ 目录也可访问

    配置如下 <VirtualHost *:80> DocumentRoot D:\web_root\test ServerName www.test.com <Directory /& ...

  9. APP手机商城系统选择,混合开发与原生开发哪个好?

    关于手机APP开发用混合还是原生现在说法不一,有说混合开发好:时间短.费用低.效果也不错,有说原生开发好,原生APP在性能方面比较好.而商城系统中的手机APP用混合开发还是原生开发比较好呢? 最近我参 ...

  10. Django Mysql数据库-基于双下划线的跨表查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...