Think myself - 无后效性(贪心+DP)

最近做了一些题,让我对之前我的思维方式产生很大的质疑。我也通过这些问题,思考我之前的思维方式,做出自己的反思,提出新的思维方式。
先通过一道题引入。简单
解决问题固然简单,关键是我们要发现背后的通性,思想的奥秘。
题目传送门
题意:
一个工厂生产一个物品,每天的生产成不尽相同,要求的产量也不尽相同。后面的产品可以在之前的时间生产,但是每天的存储费用固定为S。要你求最小的成本。
思路:
贪心记录最小的价格。

AC code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

typedef long long LL;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define pii pair
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
#define per(i,a,b) for(int i = a;i <= b;++i)
#define rep(i,a,b) for(int i = a;i >= b;--i)
const int maxn = 3e5;
int n = 0,s = 0;

int main(){
	while(~scanf("%d %d",&n,&s)){
		int minc = 1e4 + 10;
		LL ans = 0;
		per(i,1,n){
			int c = 0,y = 0;
			scanf("%d %d",&c,&y);
			minc = min(minc + s,c);
			ans += minc * y;
		}
		printf("%I64d\n",ans);
	}
	
	return 0;
}

这道题就是贪心。
这道题不算是多阶段决策最优化问题,也就是DP类型。因为当前的选择与之前所有的选择都没有关系。典型的贪心。
我之前一直卡壳,就是我思考的是如何从当前位置去往前面找到最优的填数,然后在那天生产。
这是典型的模拟思维方式。我总是用模拟的思维做想问题的解法。这种思维太常规,而且经常要考虑各种问题,实现复杂。
为什么你一定要找到那个最优的日期,然后在那天生产呢?为什么不记录传递下来的最优价格呢?找到最优的日期很麻烦,但是将最优的价格传递下去缺失十分方便的,这样我们就不用考虑那些复杂的过程了。

最近一直在看DP,有了很多新收获,也刷新了以往的认知。所以有些内容你回过头来再次阅读思考一遍,就会有新的收获。
多阶段决策过程中
无后效性:当前的S状态只与前一个S-1状态相关,也就是说,S状态只由S-1状态通过状态转移方程转移过来,而与更前面的状态无关,还有后面没有发生的状态。
这句话刷新了我之前的认识。
这句话指出了我之前思维方式的重大问题。
我考虑当前的S状态时,我总是喜欢考虑之前所有的状态,甚至之后的状态。导致问题很复杂。

你可能感兴趣的:(ACM,DP,编程思维)