我认为做动态规划题的关键是找到一个合适的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
4.生成测试数据
#include
计时方式:
#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);
数据规模n | 10 | 1000 | 100000 |
---|---|---|---|
运行时间/s | 0.000708 | 0.002277 | 0.094936 |
都是单层循环
故为O(n)