20分求巨佬帮助!
查看原帖
20分求巨佬帮助!
369347
ZkjTCTC楼主2022/11/6 16:50

贴代码:(dp解释在后面)

#include <bits/stdc++.h>
#define long long int
using namespace std;

int tp[50],dp[50][10];
int N,k;

int turn ( int b , int e ){
	if ( b>e )
		swap(b,e);
	int sum=0;
	for ( int i = b ; i <= e ; i++ ){
		sum=sum*10+tp[i];
	}
	return sum;
}

signed main (){
	cin >>N>>k;
	char c;
	for ( int i = 1 ; i <= N ; i++ ){
		cin >>c;
		tp[i]=c-'0';
	}
	
	//dp[i][k]
	for ( int i = 1 ; i <= N-k ; i++ ){
		dp[i][0]=turn(1,i);
	}
	/*
	for ( int j = 1 ; j <= N-1 ; j++ )//deal item
		for ( int kp = 0 ; kp <= min(k-1,j-1) ; kp++ )//list 'k'
			for ( int i = j+1 ; i <= N ; i++ ){//be dealt item
				int temp=turn(j+1,i);
				//cout <<"dp["<<i<<"]["<<kp+1<<"]=max(dp["<<i<<"]["<<kp+1<<"],dp["<<j<<"]["<<kp<<"]*turn("<<j+1<<","<<i<<"));"<<endl;
				dp[i][kp+1]=max(dp[i][kp+1],dp[j][kp]*temp);//right
				
			}
	*/
	for ( int i = 1 ; i <= N ; i++ )//deal item
		for ( int kp = 1 ; kp <= min(k,i-1) ; kp++ )//list 'k'
			for ( int j = 1 ; j <= i-1 ; j++ ){//be dealt item
				int temp=turn(j+1,i);
				cout <<"dp["<<i<<"]["<<kp<<"]=max(dp["<<i<<"]["<<kp<<"],dp["<<j<<"]["<<kp-1<<"]*turn("<<j+1<<","<<i<<"));"<<endl;//调试
				dp[i][kp]=max(dp[i][kp],dp[j][kp-1]*temp);//right
				
			}
			
	cout <<dp[N][k]<<endl;//下面是调试
	for ( int i = 0 ; i <= N ; i++ ){
		for ( int j = 0 ; j <= k ; j++ ){
			cout <<dp[i][j]<<" ";
		}
		cout <<endl;
	}
	return 0;
} 

QWQ~

本蒟蒻20分,上面注释掉的是递推式DP,下面的是回头望月式DP,不知到为什么会WA。

回头望月式dp表示:dp[i][k]->存前i位有k个乘号时的最大乘积。

2022/11/6 16:50
加载中...