• 【动态规划】独立任务最优调度问题


    1.题目描述

    在这里插入图片描述

    2.算法思路

    我认为做动态规划题的关键是找到一个合适的dp数组,确定它dp[i][j]的含义,用它和题目的最优子结构性质结合求解。具体思路如下:

    (笔记些许潦草hhh…)

    在这里插入图片描述

    1.dp[i][j]表示第i个作业在第j(0-A,1-B)台机器上处理,两台机器处理完i个作业的最短总时间

    2.根据最优子结构性质

    貌似

    dp[i][0]=min(dp[i-1][0],dp[i-1][1])+a[i]

    dp[i][1]=min(dp[i-1][0],dp[i-1][1])+b[i]

    陷阱在这里,前面选择的不同会直接影响A、B机器的可用时刻,因此,直接用上面的式子是不对的

    我们还需要两个变量A、B记录处理完前i-1个作业后机器A和机器B的可用时刻

    当dp[i-1][0]

    否则说明第i-1个作业在B机器完成,更新B,dp[i][0]=A+a[i],dp[i][1]=B+b[i]

    3.程序代码

    为了简介显示主要算法,计时函数没有写在下面的代码里

    #include
    using namespace std;
    #define N 10010 
    int n;
    int a[N],b[N];
    int dp[N][2]; //dp[i][j]:第i个作业在第j台机器上处理,两台机器处理完i个作业的最短总时间 
    int main(){
    	freopen("input.txt","r",stdin);
    	freopen("output.txt","w",stdout);	
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    	//memset(dp,0x3f,sizeof(dp));
    	int A=0,B=0; //用于记录A、B两台机器的可用时刻
    	dp[1][0]=a[1];
    	dp[1][1]=b[1]; 
    	for(int i=2;i<=n;i++){
    		//第i-1个作业在处理机A完成的总时间最短 
    		if(dp[i-1][0]<=dp[i-1][1]){
    			A=dp[i-1][0];
    			dp[i][0]=A+a[i];
    			dp[i][1]=B+b[i];
    		}
    		//第i-1个作业在处理机B完成的总时间最短 
    		else{
    			B=dp[i-1][1];
    			dp[i][0]=A+a[i];
    			dp[i][1]=B+b[i];
    		} 
    	}
    	if(dp[n][0]<=dp[n][1]) A=dp[n][0];
    	else B=dp[n][1];
    	printf("%d",max(A,B));
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    4.生成测试数据

    #include
    #include
    #include
    using namespace std;
    int main(){
    	int n;
    	scanf("%d",&n);
    	freopen("input.txt","w",stdout);
    	srand(time(0));
    	for(int i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5.不同规模数据实验的时间对比

    计时方式:

    #include	
    	...
    LARGE_INTEGER nFreq,nBegin,nEnd;
    QueryPerformanceFrequency(&nFreq);	
    QueryPerformanceCounter(&nBegin);
    ...//需要计算运行时间的关键代码
    QueryPerformanceCounter(&nEnd);
    double t=(double)(nEnd.QuadPart-nBegin.QuadPart)/(double)nFreq.QuadPart; //得到运行时间t
    printf("运行时间:%lf",t);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    数据规模n101000100000
    运行时间/s0.0007080.0022770.094936

    6.时间复杂度分析

    都是单层循环

    故为O(n)

  • 相关阅读:
    计算机网络(自顶向下)—第四章测验题
    dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐
    leetcode 823. Binary Trees With Factors(因子二叉树)
    面试总结 - 计算机网络
    sql:SQL优化知识点记录(十四)
    leetcode 558 设计内存文件系统
    数据库数据类型与DQL
    来自北大算法课的Leetcode题解:8. 字符串转换整数(atoi)
    java 日志打印实体类时隐藏敏感字段不打印
    Python调试指南
  • 原文地址:https://blog.csdn.net/Coco416/article/details/128213301