O(n^3)竟然能过?
查看原帖
O(n^3)竟然能过?
1284725
WJnY楼主2024/8/12 12:58
//O(n^3)代码
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 200 + 12;
int n,m,p,v[MAXN][MAXN],cost[MAXN];
int a[MAXN][MAXN],s[MAXN][MAXN],res[MAXN][MAXN];
int dp[MAXN];
int main()
{
	scanf("%d%d%d",&n,&m,&p);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			scanf("%d",&v[i][j]);
	for (int i=1;i<=n;i++) scanf("%d",cost+i);
	for (int i=1;i<=m;i++)
	{
		for (int w=1;w<=n;w++)
		{
			int j = (i-w+10*n)%n;
			if (j==0) j = n;
			a[i][w] = v[j][i];
		}
	}
	for (int i=1;i<=m;i++)
		for (int j=1;j<=n;j++)
			s[i][j] = s[i-1][j] + a[i][j];
	for (int l=1;l<=m;l++)
		for (int r=l;r<=m;r++)
		{
			res[l][r] = 0xc0c0c0c0;
			for (int i=1;i<=n;i++)
			{
				int j = (l-i+10*n)%n;
				if (j==0) j = n;
				res[l][r] = max(res[l][r],s[r][i]-s[l-1][i]-cost[j]);
			}
		}
		
			
	for (int i=m;i>=1;i--) 
		for (int j=1;j<=p&&i+j-1<=m;j++)
			dp[i] = max(dp[i],dp[i+j]+res[i][i+j-1]);
	printf("%d",dp[1]);
	return 0;
}
2024/8/12 12:58
加载中...