标签:加法 pac color 利用 题目 如何 ems 默认 eof
动态规划(DP)不是某种具体算法,而是一种思想。
核心在于:把大问题转化为小问题,利用小问题的解推断出大问题的解。
大事化小,小事化了 的思想
一、基本思想
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+7; 5 int f[maxn]; // 全局变量默认赋初值为0 6 7 int main() 8 { 9 int n; cin>>n; 10 11 for(int i=1; i<=n; i++){ 12 f[i]=f[i-1]+1; 13 if(i-5>=0) f[i]=min(f[i], f[i-5]+1); 14 if(i-11>=0) f[i]=min(f[i], f[i-11]+1); 15 16 //printf("f[%d] = %d\n", i, f[i]); 17 } 18 19 printf("f[%d] = %d\n", i, f[i]); 20 21 return 0; 22 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+7; 5 int a[maxn]={0, 1, 3, 4, 7, 2, 6, 8, 5}, n=8; 6 int f[maxn]; 7 8 int main() 9 { 10 //f[1]=1; 11 12 for(int x=1; x<=n; x++){ 13 //for(int p=1; p<x; p++) 14 for(int p=0; p<x; p++) // p要在x的前面;p从0开始,可以在max那一句把f[1]设成1 15 if(a[p]<a[x]) // a[x]可以接在a[p]的后面 16 f[x]=max(f[x], f[p]+1); 17 printf("f[%d] = %d\n", x, f[x]); 18 } 19 20 return 0; 21 }
2. 总结:
大问题和小问题的问题形式相同,问题规模不同
如果满足这个要求,那么我们遇到的每个问题,都可以很简洁地表达。我们把可能遇到的每种 “局面” 称为状态。
想用大事化小来做关于DP的题,必须先设计状态。 如何设计状态,来完整地描述当前遇到的局面?
例如上楼梯问题中:
设计完状态之后,只要能利用小状态的解求出大状态的解,就可以动手把题目做出来。
在前面三个例题中,我们都是先设计好状态,然后给出了一套用小状态推出大状态解的方法
从一个状态的解,得知另一个状态的解,我们称之为 “状态转移” 。这个转移式子称为 “状态转移方程”
设计转移有两种思路:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+7; 5 int f[maxn]; 6 7 int main() 8 { 9 int n; cin>>n; 10 11 f[0]=1; 12 13 for(int i=0; i<=n; i++){ 14 printf("f[%d] = %d\n", i, f[i]); 15 16 f[i+1]+=f[i]; 17 f[i+2]+=f[i]; 18 } 19 20 return 0; 21 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+7; 5 int f[maxn]; 6 7 int main() 8 { 9 int n; cin>>n; 10 11 memset(f, 0x3f, sizeof(f)); 12 f[0]=0; 13 14 for(int i=0; i<=n; i++){ 15 printf("f[%d] = %d\n", i, f[i]); 16 17 f[i+1]=min(f[i+1], f[i]+1); 18 f[i+5]=min(f[i+5], f[i]+1); 19 f[i+11]=min(f[i+11], f[i]+1); 20 } 21 22 return 0; 23 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+7; 5 int a[maxn]={0, 1, 3, 4, 7, 2, 6, 8, 5}, n=8; 6 int f[maxn]; 7 8 int main() 9 { 10 for(int i=1; i<=n; i++) 11 f[i]=1; 12 13 for(int x=1; x<=n; x++){ 14 printf("f[%d] = %d\n", x, f[x]); 15 16 for(int p=x+1; p<=n; p++) 17 if(a[x]<a[p]) 18 f[p]=max(f[p], f[x]+1); 19 } 20 21 return 0; 22 }
标签:加法 pac color 利用 题目 如何 ems 默认 eof
原文地址:https://www.cnblogs.com/mianing/p/12569165.html