动态规划问题

第一步确定状态
第二步写出转移方程
第三步确定初始条件和边界情况
第四步是计算顺序的确定
下面直接看代码

  1. #include<stdio.h>
  2. #define max 10000;
  3. int min(int a,int b){
  4. return a<b?a:b;
  5. }
  6. int main(){
  7. int i,j,n,l;
  8. int a[10];
  9. for(i = 0; i < 10; i++){
  10. scanf("%d",&a[i]);
  11. }
  12. scanf("%d",&n);
  13. //dp[i] 行走i公里所需要的最少费用,因为数组是从0开始,所以要数组元素设成n+1
  14. int dp[n+1];
  15. //dp[0]表示初始状态,走了0公里,所以费用为0
  16. dp[0] = 0;
  17. //因为dp[i]需要依靠前面所确定的最小费用来确定,所以顺序是从i到n。
  18. for(i = 1; i <= n; i++){
  19. dp[i] = max;
  20. for(j = 0; j < 10; j++){
  21. l = j + 1;
  22. if(i >= l){
  23. //状态方程
  24. dp[i] = min(dp[i-l]+a[j],dp[i]);
  25. }
  26. }
  27. }
  28. //最后求得的dp[n]即为答案
  29. printf("%d",dp[n]);
  30. }

第一次写题解,讲的不是很清楚大家多多包涵,有关动态规划的问题可以多去b站上看相关视频,我也是先在b站上看了相关视频才来这里做的,一开头写的那四步是求这类动态规划题目的基本思路。

点赞(0)
 

9.9 分

7 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

Harvey 3年前 回复TA
#include<iostream>
using namespace std;
#include<algorithm>
const int Max_sum=10000;
int main()
{
	int a[11];
	for(int i=1;i<=10;i++)
	{
		cin>>a[i];
		
		
	}
	int n;
	cin>>n;
	int dp[n+1];
	dp[0]=0;
	for(int i=1;i<=n;i++)
	{
		dp[i]=Max_sum;
		if(i>=10)
		{
			for(int j=1;j<=10;j++)
			{
			dp[i]=min(dp[i-j]+a[j],dp[i]);
			}
		}else{
			for(int j=1;j<=10-i;j++)
			dp[i]=min(dp[i-j]+a[j],dp[i]);
		}
		
	}
	
	cout<<dp[n]<<endl;
	
	  
	return 0;
}
为什么我按照你这思路写得过不了?(测了几组数据都行)
Brynn 4年前 回复TA
#define max 10000;为什么要这样子 max 是10000??