博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3265
阅读量:7072 次
发布时间:2019-06-28

本文共 1320 字,大约阅读时间需要 4 分钟。

考状态的dp

我的方法可能比较奇怪

设f[i,j]表示第i个月解决j个问题可以最多解决到第几个问题

容易知道,答案(月份)不会超过2n+1;

f[i,j]=max(f[i-1,k]+j) 

复杂度为O(n^3)

代码如下

1 var f:array[0..1000,0..500] of longint; 2     b,a,sa,sb:array[0..500] of longint; 3     p,y,q,i,j,k,n,m:longint; 4 function max(a,b:longint):longint; 5   begin 6     if a>b then exit(a) else exit(b); 7   end; 8  9 begin10   readln(m,n);11   for i:=1 to n do12   begin13     readln(b[i],a[i]);14     sa[i]:=sa[i-1]+a[i];15     sb[i]:=sb[i-1]+b[i];16   end;17   f[1,0]:=0;18   i:=1;19   while i<=2*n+1 do20   begin21     inc(i);22     f[i,0]:=f[i-1,0];23     for j:=1 to n do24     begin25       if f[i-1,j]=0 then break;26       f[i,0]:=max(f[i,0],f[i-1,j]);27     end;28     for j:=1 to n do29     begin30       for k:=0 to n do31       begin32         if (f[i-1,k]=0) and (k<>0) then break;    //后面的状态不存在,直接退33         p:=f[i-1,k];34         q:=f[i-1,k]+j;35         if q>n then continue;36         y:=f[i-1,k]-k;37         if (sb[q]-sb[p]+sa[p]-sa[y]<=m) and (sa[q]-sa[p]<=m) then          //判断是否够这个月花的38           f[i,j]:=max(f[i,j],f[i-1,k]+j);39       end;40       if f[i,j]>=n then41       begin42         writeln(i+1);    //注意付完款一定是下个月43         halt;44       end;45       if f[i,j]=0 then break;46     end;47   end;48 end.
View Code

话说代码有的地方可能写的比较冗杂……

 

转载于:https://www.cnblogs.com/phile/p/4473292.html

你可能感兴趣的文章
头文件和宏
查看>>
Android开发学习笔记:浅谈WebView
查看>>
设计模式之------命令链模式
查看>>
DNS解析服务器
查看>>
unable kill namenode hadoop3.0.3 解决到放弃解决的过程
查看>>
解决软件提示unable to find a version of runtime to
查看>>
第二课unit3 系统延迟及定时机制
查看>>
十二月机房考核
查看>>
shell 类型
查看>>
网页中meta标记
查看>>
python爬虫笔记-day5
查看>>
Jenkins+newman 控制台输出样式
查看>>
公司业务转型,IT基础架构也要转型,京东云Docker容器集群微服务实践
查看>>
解释try_files $uri $uri/ /index.php$is_args$args;
查看>>
营销圈也可以提供类似“不涂口红的你”的创意文案?
查看>>
【源码分享】短信验证码功能对接CmsEasy
查看>>
学习linux入门之top命令的用法介绍
查看>>
MySQL的基础分部
查看>>
aix knowlgdgecenter
查看>>
好程序员分享JavaScript事件委托代理和函数封装详解
查看>>