(棄療擱置)poj 1821 Fence

Fence
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 3586   Accepted: 1087

Description

A team of k (1 <= K <= 100) workers should paint a fence which contains N (1 <= N <= 16 000) planks numbered from 1 to N from left to right. Each worker i (1 <= i <= K) should sit in front of the plank Si and he may paint only a compact interval (this means that the planks from the interval should be consecutive). This interval should contain the Si plank. Also a worker should not paint more than Li planks and for each painted plank he should receive Pi $ (1 <= Pi <= 10 000). A plank should be painted by no more than one worker. All the numbers Si should be distinct. 

Being the team's leader you want to determine for each worker the interval that he should paint, knowing that the total income should be maximal. The total income represents the sum of the workers personal income. 

Write a program that determines the total maximal income obtained by the K workers. 

Input

The input contains: 
Input 

N K 
L1 P1 S1 
L2 P2 S2 
... 
LK PK SK 

Semnification 

N -the number of the planks; K ? the number of the workers 
Li -the maximal number of planks that can be painted by worker i 
Pi -the sum received by worker i for a painted plank 
Si -the plank in front of which sits the worker i 

Output

The output contains a single integer, the total maximal income.

Sample Input

8 4
3 2 2
3 2 3
3 3 5
1 1 7 

Sample Output

17

Hint

Explanation of the sample: 

the worker 1 paints the interval [1, 2]; 

the worker 2 paints the interval [3, 4]; 

the worker 3 paints the interval [5, 7]; 

the worker 4 does not paint any plank 

Source



題目大意:

一段籬笆由N個連續的木板組成。有K個工人給木板塗色。

每個工人有3個屬性:L 表示他塗的最長連續木板區間長度,S表示他必須塗哪一塊,P表示每塗一個木板的收益。

要注意的是,工人i可以選擇不塗任何木板,否則,他的塗色區域必須是連續的一段,並且S[i]必須包含在內

 最後還有,每塊木板只能被塗一次。 






自己寫的代碼,等功夫夠了再回來擼

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <functional>
#define maxn 16015
#define maxk 115

using namespace std;
struct W{
    int l,p,s;
};
W worker[maxk];
int N,K;
int dp[maxk][maxn];

int comp(const W &a,const W &b)
{
    return a.s<b.s;
}

int main()
{
    scanf("%d %d",&N,&K);
    for(int i=1;i<=K;i+=1){
        scanf("%d %d %d",&worker[i].l,&worker[i].p,&worker[i].s);
    }
    sort(worker+1,worker+K+1,comp);
    memset(dp,0,sizeof(dp));
    dp[1][worker[1].s]+=min(worker[1].s,worker[1].l)*worker[1].p;
    for(int i=worker[1].s+1;i<=worker[1].s+worker[1].l-1;i+=1){
        dp[1][i]+=min(i,worker[1].l)*worker[1].p;
    }
    int ans=0;
    worker[0].s=0,worker[0].l=0,worker[0].p=0;
    for(int i=1;i<=K;i+=1){
        for(int ii=0;ii<=i;ii+=1){
            for(int j=worker[i].s;j<=worker[i].s+worker[i].l-1&&j<=N;j+=1){
                for(int k=worker[ii].s;!k||k<=worker[ii].s+worker[ii].l-1&&k<=j;k+=1){
                    dp[i][j]=max(dp[i][j],dp[ii][k]+min(j-k,worker[i].l)*worker[i].p);
                }
            }
        }
        if(i==K){
            for(int j=worker[i].s;j<=worker[i].s+worker[i].l-1&&j<=N;j+=1){
                ans=max(ans,dp[i][j]);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}







發佈了91 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章