dp求助
查看原帖
dp求助
455994
Chenyj29楼主2024/8/18 17:15

为什么最后不能直接输出最大时间的dp值,而是要全部找一遍最大值

WA代码

#include<bits/stdc++.h>
//#define int long long
#define IN(x) freopen(#x".in","r",stdin)
#define OUT(x) freopen(#x".out","w",stdout)
template<class T=int>
inline T read(){
    T x=0; bool sgn=0; char c=0;
    for(;!isdigit(c);c=getchar())sgn|=(c=='-');
    for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
    return sgn?-x:x;
}
inline void write(char c){putchar(c);}
template<class T>
inline void write(T x){
    static char c[40]; unsigned p=0;
    if(x<0)x=-x,putchar('-');
    do c[++p]=(x%10)^48,x/=10; while(x);
    while(p)putchar(c[p--]);
}
template<class T,class ...U>
inline void write(T x,U ...t){
    write(x),write(t...);
}
using namespace std;
const int N=1e4+10;
int n;
typedef pair<int,int> pii;
pii a[N];
int f[N];
signed main(){
	while(cin>>n){
		memset(f,0,sizeof f);
		for(int i=1;i<=n;++i)cin>>a[i].second>>a[i].first;
		sort(a+1,a+1+n);
		for(int i=1;i<=n;++i){
			for(int j=a[i].first;j;--j)
				f[j]=max(f[j],f[j-1]+a[i].second);
		}
		cout<<f[a[n].first]<<endl;
	}
	return 0;
}

AC代码

#include<bits/stdc++.h>
//#define int long long
#define IN(x) freopen(#x".in","r",stdin)
#define OUT(x) freopen(#x".out","w",stdout)
template<class T=int>
inline T read(){
    T x=0; bool sgn=0; char c=0;
    for(;!isdigit(c);c=getchar())sgn|=(c=='-');
    for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
    return sgn?-x:x;
}
inline void write(char c){putchar(c);}
template<class T>
inline void write(T x){
    static char c[40]; unsigned p=0;
    if(x<0)x=-x,putchar('-');
    do c[++p]=(x%10)^48,x/=10; while(x);
    while(p)putchar(c[p--]);
}
template<class T,class ...U>
inline void write(T x,U ...t){
    write(x),write(t...);
}
using namespace std;
const int N=1e4+10;
int n;
typedef pair<int,int> pii;
pii a[N];
int f[N];
signed main(){
	while(cin>>n){
		memset(f,0,sizeof f);
		for(int i=1;i<=n;++i)cin>>a[i].second>>a[i].first;
		sort(a+1,a+1+n);
		int ans=0;
		for(int i=1;i<=n;++i){
			for(int j=a[i].first;j;--j)
				f[j]=max(f[j],f[j-1]+a[i].second);
		}
		for(int i=0;i<=a[n].first;++i)ans=max(ans,f[i]);
		cout<<ans<<endl;
	}
	return 0;
}

2024/8/18 17:15
加载中...