动态规划练习题

RQNOJ 496

/*
  dp记录路径的问题
  f[i][j]表示用前j个花瓶盛放前i朵花的最大值
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 110
#define INF 1000000000
using namespace std;
int a[N][N],f[N][N],q[N],n,m;
int main()
{
    memset(f,-127/3,sizeof(f));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        scanf("%d",&a[i][j]);
    f[0][0]=0;
    for(int i=1;i<=n;i++)
      for(int j=i;j<=m;j++)
        for(int k=i-1;k<j;k++)
          f[i][j]=max(f[i-1][k]+a[i][j],f[i][j]);
    int ans=-INF,pos;
    for(int i=n;i<=m;i++)
      if(f[n][i]>ans)
      {
          ans=f[n][i];pos=i;
      }
    printf("%d\n",ans);
    q[n]=pos;
    int x=n;
    while(x--)
    {
        for(int i=1;i<pos;i++)
          if(f[x][i]==ans-a[x+1][pos])
          {
              q[x]=i;ans-=a[x+1][pos];pos=i;
              break;
          }
    }
    for(int i=1;i<=n;i++)printf("%d ",q[i]);
    return 0;
}

tyvj 1313

/*
  朴素的动规很好想,f[i]表示选前i个且第i个必选的最小值。f[i]=f[j]+a[i]
  因为可以选的j来自一段固定长度的区间,并且我们每次要选最小值,所以可以用单调队列优化。
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 1000010
#define inf 2100000000
using namespace std;
int n,m,head,tail,Min;
int q[N],a[N],f[N];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    for (int i=1;i<=n;i++)
    {
        while (q[head]<i-m&&head<=tail) head++;
        f[i]=a[i]+f[q[head]];
        while (f[q[tail]]>f[i]&&head<=tail) tail--;
        q[++tail]=i;
    }
    Min=inf;
    for (int i=n-m+1;i<=n;++i)
      Min=min(Min,f[i]);
    printf("%d\n",Min);  }

洛谷 1650

/*
  虽说是dp,但总觉得有些贪心的思想在里面
  因为我们尽量要把齐王的跑得慢的马比下去,而且要尽量用田忌的马中比较慢的。
  所以先排一遍序,然后当当前田忌的马慢时,换下一匹,如果一样快,可以换下一匹,也可以这样比,如果快,就比。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 2016
#define inf 100000000
using namespace std;
int a[N],b[N],f[N][N],n,ans=-inf;
int dfs(int x,int y)
{
    if(f[x][y]!=-1)return f[x][y];
    if(x>n)return 0;
    if(a[x]<b[y])f[x][y]=dfs(x+1,y)-200;
    else if(a[x]==b[y])
      f[x][y]=max(dfs(x+1,y)-200,dfs(x+1,y+1));
    else f[x][y]=dfs(x+1,y+1)+200;
    return f[x][y];
}
int main()
{
    freopen("jh.in","r",stdin);
    memset(f,-1,sizeof(f));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
      scanf("%d",&b[i]);
    sort(a+1,a+n+1);sort(b+1,b+n+1);
    printf("%d",dfs(1,1));
    return 0;
}

洛谷 1594

/*
  80分,有两个数据爆了double了,没有过
  记忆化搜索,很好理解。
  f[x][y]表示通过前x辆车,且第x辆车所属车队以y开头的最少时间
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1010
using namespace std;
int w[N],n,zz;double f[N][N],t[N],s,ans=100000000.0;
double query(int x,int y)//数据较弱,懒得写rmq了
{
    double maxn=0;
    for(int i=x;i<=y;i++)
      maxn=max(maxn,t[i]);
    return maxn;
}
double dfs(int x,int y)
{
    if(f[x][y]!=-1.0)return f[x][y];
    if(x>n)return 0;
    if(w[x+1]-w[y-1]<=zz&&x<n)
      f[x][y]=min(dfs(x+1,y),dfs(x+1,x+1)+query(y,x));
    else
      f[x][y]=dfs(x+1,x+1)+query(y,x);
    return f[x][y];
}
int main()
{
    scanf("%d%lf%d",&zz,&s,&n);
    for(int i=0;i<=n;i++)
      for(int j=0;j<=n;j++)
        f[i][j]=-1.0;
    for(int i=1;i<=n;i++)
    {
        double v;scanf("%d%lf",&w[i],&v);
        t[i]=s*60/v;w[i]+=w[i-1];
    }
    printf("%.1lf",dfs(1,1));
    return 0;
}
时间: 2024-12-24 16:39:15

动态规划练习题的相关文章

动态规划练习题(2)

1.完全背包(knapsack.pas) AYYZOJ p1473 1 program p1473; 2 const 3 maxm=200; maxn=30; 4 var 5 i,j,n,m:integer; 6 w,u:array[1..maxn] of integer; 7 f:array[0..maxn,0..maxm] of integer; 8 begin 9 fillchar(w,sizeof(w),0); 10 fillchar(u,sizeof(u),0); 11 readln(

动态规划练习题 汇率

题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入 输入文件的第一行是一个自然数N,1≤N≤100,表示戴维学习汇率的天数. 接下来的N行中每行是一个自然数A,1≤A≤1000.第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元. 输出 输出文件的第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数). 注意:考虑到实数

动态规划练习题(1)

1.0/1背包(package.pas) AYYZOJ p1472 1 program p1472; 2 const 3 maxm=200; maxn=30; 4 var 5 m,n,i,j:integer; 6 c,w:array[1..maxn] of integer; 7 f:array[0..maxn,0..maxm] of integer; 8 function max(x,y:integer):integer; 9 begin 10 if x>y then max:=x else m

转载:动态规划

来源:http://blog.sina.com.cn/s/blog_7727572f01011461.html 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问

练习题(3) -- 另类的动态规划问题

题目如下: 已知 1) 对于数字1  可以表达为 (1) 2) 对于数字2  可以表达为 (1,1)   (2) 解释 1 + 1 = 2 3)  对于数字3  可以表达为 (1,1,1)  (1, 2)  (2, 1)   (3) 1 + 1 + 1 = 3 1 + 2 = 3 2 + 1 = 3 求对于数字N  所有表达项 解法提示: 这是一道比较简单的动态规划问题 对于数字3如果我们把它的所有表达想这样书写 以1为开头的序列的后半部分的和是2 动态规划有两个要素,一个是备忘录,一个是递推公

《挑战程序设计竞赛》课后练习题解集——3.4 熟练掌握动态规划

<挑战程序设计竞赛>课后练习题解集——3.4 熟练掌握动态规划 状态压缩DP POJ 2441  有N头牛,M个槽,N,M≤20,每头牛只在指定的pi个槽里进食,不与其他牛共享槽.问有多少种分配方案. dp[i][S],当前第i头牛要进食,槽的使用状态为S 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 using namespace std; 5 6 int n, m; 7 in

练习题7:袋鼠过河(使用了动态规划求解)

题目描述 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远.每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃.河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸.如果无法到达输出-1. 输入描述: 输入分两行,第一行是数组长度N (1 ≤ N ≤ 1000

动态规划 Dynamic Programming

March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的

几个python练习题

从python公众号里面看到了几道python的练习题,就拿来练练手,结果上手了发现自己还是特别水,不是很难的8道题,我只做出来5道,其中还3道题卡住了,边查边做的.原题链接在这里:http://python.jobbole.com/83641/ 1. 编写代码, 打印1-1亿之内的偶数 看完题目想都没想就直接写了一句: 1 print [i for i in xrange(1, 10**9) if i % 2 == 0]  开始跑结果.然后.死机了.重启时候反省了一下,嗯,的确是有点二,一下生