dp三维数组方法为什么不对
查看原帖
dp三维数组方法为什么不对
700689
YTZJZYC楼主2023/11/11 11:56

RT

是不是这个题本来就用不了三维数组

因为当 fi,0,0f_{i,0,0} 与 fii,0,1f_i{i,0,1} 赋为极小值的时候虽然能过滤掉错解,但也会让正解变成负无穷。

感谢大佬!!!

#include<bits/stdc++.h>
#define int long long
#define N 1005
using namespace std;
int n,m,k,a[N],f[N][N][2]; 

signed main(){
	scanf("%lld%lld%lld",&n,&k,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",a+i);
	}
	if(n/k>m){
		puts("-1");
	}else{
		memset(f,-0x3f,sizeof f);
		f[0][0][0]=0;
//		for(int i=1;i<=m;i++){
//			f[0][i][0]=0;
//			f[0][i][1]=0;
//			//f[i][0][1]=0;
//			//f[i][0][0]=0;
//		}
//		f[1][1][0]=0;
		for(int i=1;i<=n;i++){
			for(int w=1;w<=m;w++){
				for(int j=1;j<=k && i-j>=1;j++){
					if(f[i][w][0] < f[i-j][w][1]){
						f[i][w][0]=f[i-j][w][1];
					}
				}
				f[i][w][1]=max(f[i-1][w-1][1],f[i-1][w-1][0])+a[i];
				//cout<<f[i][w][1]<<" "<<f[i][w][0]<<" | ";
			}
			//cout<<endl;
		}
		printf("%lld",max(f[n][m][1] , f[n][m][0]));
	}
    return 0;
}
2023/11/11 11:56
加载中...