vijos p1002 dp ***
2015-07-10 10:28
295 查看
链接:点我
一开始的方程式很好写的,但是数据太大,考虑到石子数目很小,我们对其进行离散化,若相邻两点距离超过ya的值,则后面所有点都往前移动,这里ya的值是可以调整的
一开始的方程式很好写的,但是数据太大,考虑到石子数目很小,我们对其进行离散化,若相邻两点距离超过ya的值,则后面所有点都往前移动,这里ya的值是可以调整的
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn=110; const int maxdp=100001; const int inf=100000000; const int ya=75; int len,s,t,n; int cnt=0; int a[maxn],dp[maxdp],v[maxdp]; int cmp(int x,int y) { return x<y; } int main() { cin>>len>>s>>t>>n; for(int i=1;i<=n;i++) cin>>a[i]; a[n+1]=len; a[0]=0; if(s==t) { for(int i=1;i<=n;i++) if(a[i]%s==0) cnt++; cout<<cnt; return 0; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n+1;i++) if(a[i]-a[i-1]>ya) { int t=a[i]-a[i-1]-ya; for(int j=i;j<=n+1;j++) a[j]=a[j]-t; } memset(v,0,sizeof(v)); for(int i=1;i<=n;i++) v[a[i]]=1; len=a[n+1]; for(int i=0;i<maxdp;i++) dp[i]=inf; dp[0]=0; for(int i=1;i<=len;i++) for(int j=i-t;j<=i-s;j++) if(j>=0) dp[i]=min(dp[i],dp[j]+v[i]); cout<<dp[len]; return 0; }
相关文章推荐
- Windows2003下批量添加和导出所有ip BAT脚本
- JSP内置对象与servlet对应关系
- java 面向对象
- 不要使用SBJSON(json-framework)
- ExecutorService与Executors例子的简单剖析
- HDU2222 Keywords Search (字符串处理-ac自动机)
- I、P、B帧的区别
- opencv学习笔记一(配置)
- Palindrome Linked List
- System.in.read() 回车
- Python中获取异常(Exception)信息
- dada
- 用转换器把ppt转为pdf的详细步骤
- linux系统怎么重启网卡?linux重启网卡的三种教程
- Linux下halt,poweroff,reboot,shutdown命令的区别
- org.testng.TestNGException: Cannot find class in classpath
- UITableViewCell重叠
- iOS将颜色转换image方法
- Scala 函数式编程
- jQuery.extend 函数详解