写二维过不了,写一维过的了,时间和空间都没超啊?

P1417 烹调方案

Esuan24 @ 2017-10-31 11:17:54

rt。 二维(wa):

#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct node {
    LL a,b,c;
} m[100010];
LL t,n,F[51][100010],maxn=0;
inline bool cmp(node a,node b) {
    return a.c*b.b<b.c*a.b;
}
int main() {
    //memset(F,255,sizeof(F));
    cin>>t>>n;
    for(LL i=1; i<=n; i++)cin>>m[i].a;
    for(LL i=1; i<=n; i++)cin>>m[i].b;
    for(LL i=1; i<=n; i++)cin>>m[i].c;
    sort(m+1,m+1+n,cmp);
    for(LL i=1; i<=n; i++) {
        for(LL j=m[i].c; j<=t; j++)
            F[i][j]=max(F[i-1][j],F[i-1][j-m[i].c]+m[i].a-j*m[i].b);
    }
    for(LL i=1; i<=n; i++)
        for(LL j=m[i].c;j<=t;j++)
            maxn=max(maxn,F[i][j]);
    cout<<maxn;
    return 0;
}

一维(ac):

#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct node {
    LL a,b,c;
} m[100010];
LL t,n,F[100010],maxn=0;
inline bool cmp(node a,node b) {
    return a.c*b.b<b.c*a.b;
}
int main() {
    //memset(F,255,sizeof(F));
    cin>>t>>n;
    for(LL i=1; i<=n; i++)cin>>m[i].a;
    for(LL i=1; i<=n; i++)cin>>m[i].b;
    for(LL i=1; i<=n; i++)cin>>m[i].c;
    sort(m+1,m+1+n,cmp);
    for(LL i=1; i<=n; i++) {
        for(LL j=t; j>=m[i].c; j--)
                F[j]=max(F[j],F[j-m[i].c]+m[i].a-j*m[i].b);
    }
    for(LL i=1; i<=t; i++)
        maxn=max(maxn,F[i]);
    cout<<maxn;
    return 0;
}

by liuxuan0818 @ 2017-11-01 15:23:38

+1,二维只有55分,一维AC。。。。


by Santiego @ 2018-10-30 12:41:40

+1


by zjcOvO @ 2019-06-02 11:32:03

    for(LL i=1; i<=n; i++) {
        for(LL j=m[i].c; j<=t; j++)
            F[i][j]=max(F[i-1][j],F[i-1][j-m[i].c]+m[i].a-j*m[i].b);
    }

你的f数组 f[i][t](t<j)没有更新

在第一个循环内加一行

for(LL j=1;j<=m[i].c;j++)
    F[i][j]=F[i-1][j];

by zjcOvO @ 2019-06-02 11:32:54

错了,是 t<m[i].c


|