日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 4502

發布時間:2025/3/16 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 4502 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description 俗話說一分錢難倒英雄漢,高中幾年下來,吉哥已經深深明白了這個道理,因此,新年開始存儲一年的個人資金已經成了習慣,不過自從大學之后他不好意思再向大人要壓歲錢了,只能把唯一的希望放到自己身上。可是由于時間段的特殊性和自己能力的因素,只能找到些零零碎碎的工作,吉哥想知道怎么安排自己的假期才能獲得最多的工資。
  已知吉哥一共有m天的假期,每天的編號從1到m,一共有n份可以做的工作,每份工作都知道起始時間s,終止時間e和對應的工資c,每份工作的起始和終止時間以天為單位(即天數編號),每份工作必須從起始時間做到終止時間才能得到總工資c,且不能存在時間重疊的工作。比如,第1天起始第2天結束的工作不能和第2天起始,第4天結束的工作一起被選定,因為第2天吉哥只能在一個地方工作。
  現在,吉哥想知道怎么安排才能在假期的m天內獲得最大的工資數(第m+1天吉哥必須返回學校,m天以后起始或終止的工作是不能完成的)。

Input 第一行是數據的組數T;每組數據的第一行是2個正整數:假期時間m和可做的工作數n;接下來n行分別有3個正整數描述對應的n個工作的起始時間s,終止時間e,總工資c。

[Technical Specification]
1<=T<=1000
9<m<=100
0<n<=1000
s<=100, e<=100, s<=e
c<=10000

Output 對于每組數據,輸出吉哥可獲得的最高工資數。

Sample Input 1 10 5 1 5 100 3 10 10 5 10 100 1 4 2 6 12 266
Sample Output 102

解題思路:先說一說我一開始的想法,dp[i][j]表示前i天完成前j件工作,由于每個工作完成的時間是固定的,所以先對其按照e從小到大排序,可惜超時了,主要的原因是要枚舉工作n,這樣使得復雜度比較高了。

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;struct Node {int s,e,c; }job[105]; int n,m,dp[105][1005];bool cmp(Node a,Node b) {return a.e < b.e; }int main() {int t;scanf("%d",&t);while(t--){scanf("%d%d",&m,&n);for(int i = 1; i <= n; i++)scanf("%d%d%d",&job[i].s,&job[i].e,&job[i].c);sort(job+1,job+1+n,cmp);memset(dp,0,sizeof(dp));for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){dp[i][j] = max(dp[i-1][j],dp[i][j-1]);//前i-1天完成前j件工作,前i天完成前j-1件工作。if(job[j].e == i)dp[i][j] = max(dp[i][j],dp[job[j].s-1][j-1]+job[j].c);}printf("%d\n",dp[m][n]);}return 0; }
參考了別人的思路:首先用一個二維數組a[x][y]預處理從x-y天可以獲得的最大工資,這樣就只需要枚舉m,與n無關了。

#include <stdio.h> #include <string.h> #include <algorithm> using namespace std;int main() {int n,m,i,j,t;int a[105][105],dp[105];scanf("%d",&t);while(t--){memset(a,0,sizeof(a));memset(dp,0,sizeof(dp));scanf("%d%d",&n,&m);for(i = 1;i<=m;i++){int x,y,c;scanf("%d%d%d",&x,&y,&c);a[x][y] = max(a[x][y],c);}for(i = 1;i<=n;i++){for(j = i;j>=1;j--)dp[i] = max(dp[i],dp[j-1]+a[j][i]);//0~j-1時刻最大收益加上j~i時刻的收益}printf("%d\n",dp[n]);}return 0; }

總結

以上是生活随笔為你收集整理的hdu 4502的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。