为什么只过了百分之40,我觉得我思路没什么问题,有大佬解惑一下吗?
查看原帖
为什么只过了百分之40,我觉得我思路没什么问题,有大佬解惑一下吗?
1332997
sdjyyds楼主2024/5/2 17:28

我参照数字三角形来做的,从到达最后一层的结果上,对于每一个到大最后一层一定为最优解,存下他们的路径,然后对于大的数使用*3,为什么后面的数据过不了,而且一开始的测试样例也不对,哭了。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <vector>

using namespace std;

const int N = 110;

#define x first
#define y second
typedef pair<int,int> PII;

typedef long long LL;
const LL INF = 1e13;
int n,k,a[N][N];
LL f[N][N],res;
PII pre[N][N];
vector<LL> value[N];

int main()
{
	cin >> n >> k;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= i; j++)
			cin >> a[i][j];
	
	for(int i = 0; i <= n; i++)
		for(int j = 0; j <= i + 1; j++)
			f[i][j] = -INF;
	
	f[1][1] = a[1][1];	
	for(int i = 2; i <= n; i++)
		for(int j = 1; j <= i; j++)
		{
			if(f[i][j] < f[i - 1][j - 1] + a[i][j])
			{
				f[i][j] = f[i - 1][j - 1] + a[i][j];
				pre[i][j] = {i - 1,j - 1};
			}
			if(f[i][j] < f[i - 1][j] + a[i][j])
			{
				f[i][j] = f[i - 1][j] + a[i][j];
				pre[i][j] = {i - 1,j};
			}
		//	if(i == 2) cout << pre[i][j].x << " " << pre[i][j].y << endl;
		}
	
	//记录下打到最后一行的路经上的值 
	for(int j = 1; j <= n; j++)
	{
		int x = n, y = j;
		//cout << j << endl;
		while(x > 1)
		{
			value[j].push_back(a[x][y]);
		//	cout << x << " " << y << endl;
			PII t = pre[x][y];
			x = t.x, y = t.y;
		}
//		cout << x << " " << y << endl;
//		cout << endl;
		value[j].push_back(a[x][y]);
		sort(value[j].begin(),value[j].end(),greater<LL>());
	}
	 
	//再使用魔法
	for(int j = 1; j <= n; j++)
	{
		LL temp = 0;
	//	for(int i = 0; i < value[j].size(); i++) cout << value[j][i] << " ";
	//	cout << endl;
		for(int i = 0; i < k && i < n && value[j][i] > 0; i++) value[j][i] *= 3;
		for(int i = 0; i < value[j].size(); i++)  temp += value[j][i];
		res = max(res,temp);
	}		
	
	cout << res;
	
	return 0;
}
2024/5/2 17:28
加载中...