题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4502
方法:设F(m)为在第m天累积到的工资,第i个工作开始时间为bi,结束时间ei,工资为si,总共天数M。建立状态转移方程:
{
0, m==0;
F(m) = Max(F(bi-1)+si,F(m)); m>=ei,
F(m), m<ei;
}.
最终F(M)为问题的解。
通过2重循环循环来实现对工作的处理顺序是按照工作的结束时间来的,这样就不需要排序。
感想:需要动点脑筋建下模。
代码:
View Code
#include<iostream> using namespace std; int MyMax(int x,int y) { if(x>=y) return x; else return y; } int main() { int t,m,n,tc=0;; cin>>t; int records[101]; int starts[1000]; int ends[1000]; int salaries[1000]; while(tc<t) { memset(records,0,sizeof(records)); int i = 0; scanf("%d %d",&m,&n); while(i<n) { scanf("%d %d %d",&starts[i],&ends[i],&salaries[i]); i++; } for(int i=0;i<=m;i++) { for(int j=0;j<n;j++) { if(i>=ends[j]) records[i] = MyMax(records[starts[j]-1]+salaries[j],records[i]); } } cout<<records[m]<<endl; tc++; } return 0; }