zoukankan      html  css  js  c++  java
  • 洛谷 P1052 过河 (离散化+dp)

    dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t
    然后因为L非常大,所以我就不知道该怎么搞了
    我看到m只有100,而L有1e9,我就知道肯定要通过某种数学方法来离散化
    然而我并没有想出来这个数学方法

    看来题解,原来这个方法很简单,我怎么就没有想到
    因为最大走10步,所以把距离对1到10的最小公倍数是2520取模就好了。
    离散化之后就可以愉快地dp了

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    #define _for(i, a, b) for(int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXM = 312345;
    const int MAXN = 112;
    int f[MAXM], a[MAXN], d[MAXN];
    int stone[MAXM], s, t, n, L;
    
    int main()
    {
    	scanf("%d%d%d%d", &L, &s, &t, &n);
    	_for(i, 1, n) scanf("%d", &a[i]);
    	sort(a + 1, a + n + 1);
    	
    	_for(i, 1, n) d[i] = (a[i] - a[i-1]) % 2520;
    	_for(i, 1, n) a[i] = a[i-1] + d[i], stone[a[i]] = 1;
    	L = a[n];
    	
    	memset(f, 0x3f, sizeof(f));
    	f[0] = 0;
    	_for(i, 1, L + t)
    		_for(len, s, min(i, t))
    			f[i] = min(f[i], f[i-len] + stone[i]);
    	
    	int ans = 1e8;
    	_for(i, L, L + t)
    		ans = min(ans, f[i]);
    	printf("%d
    ", ans);
    	
    	return 0;
    }

    当然还有更好的优化方式

    当距离小于t时保持不变,大于t时,改成d % t + t(一定要再加上t!!!)

    我一开始是有想到,但是我想到还有s,s+1等
    说实话不用想得这么完美,直接用最大的t模就好了。

    这样空间可以开小很多。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    #define _for(i, a, b) for(int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXM = 2123;
    const int MAXN = 112;
    int f[MAXM], a[MAXN], d[MAXN];
    int stone[MAXM], s, t, n, L;
    
    int main()
    {
    	scanf("%d%d%d%d", &L, &s, &t, &n);
    	_for(i, 1, n) scanf("%d", &a[i]);
    	sort(a + 1, a + n + 1);
    
    	_for(i, 1, n) 
    	{
    		d[i] = a[i] - a[i-1];
    		if(d[i] > t) d[i] = (d[i] % t) + t; 
    	}
    	_for(i, 1, n) a[i] = a[i-1] + d[i], stone[a[i]] = 1;
    	L = a[n];
    	
    	memset(f, 0x3f, sizeof(f));
    	f[0] = 0;
    	_for(i, 1, L + t)
    		_for(len, s, min(i, t))
    			f[i] = min(f[i], f[i-len] + stone[i]);
    	
    	int ans = 1e8;
    	_for(i, L, L + t)
    		ans = min(ans, f[i]);
    	printf("%d
    ", ans);
    	
    	return 0;
    }
  • 相关阅读:
    struts2 <s:iterator> 遍历方法
    JSP 基础之 JSTL <c:forEach>用法
    struts2 中 Session的使用简介
    Struts2 工作流程
    Aandroid Error之 新导入工程报Unable to resolve target 'android-18'和R cannot be resolved
    纯Html+Ajax和JSP两者对比的个人理解
    移动互联网App兼容性测试
    【转】【Mac】invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library
    【转】Mac使用apt-get
    有趣网址之家 – 收藏全球最有趣的网站
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819378.html
Copyright © 2011-2022 走看看