题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4502
本题是动态规划,dp[i]表示到今天所能挣到最多的钱,dp[i] = MAX(dp[i], dp[j] + a[j+1][i]);其中a[i][j]表示:从i到j天的工资!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 110;
int MAX(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int T, iHoliday, iWorks, i, j, iStart, iEnd, iSalary;
int iWorkDay[MAXN][MAXN];
int dp[MAXN];
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &iHoliday, &iWorks);
memset(iWorkDay, 0, sizeof(iWorkDay));
memset(dp, 0, sizeof(dp));
for(i = 0; i < iWorks; ++i)
{
scanf("%d %d %d", &iStart, &iEnd, &iSalary);
if(iStart > iHoliday || iEnd > iHoliday)
continue ;
if(iSalary > iWorkDay[iStart][iEnd])
iWorkDay[iStart][iEnd] = iSalary;
}
for(i = 1; i <= iHoliday; ++i)
{
for(j = 0; j < i; ++j)
{
dp[i] = MAX(dp[i], dp[j] + iWorkDay[j+1][i]);
}
}
printf("%d\n", dp[iHoliday]);
}
return 0;
}