luoguP1070 道路游戏

比较好的dp。。。
dp方程被我一眼想出来。。。。我偷瞄一下题解。。。。发现还是对的。。。。
自己看 代码。。。。
总体复杂度有
O ( N 3 ) O(N^3)
这个要优化的话,可以套个优先/单调队列优化成
O ( N 2 ) O(N^2)

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

int n,m,p,gd[1005][1005],cost[1005];
int f[1005],sum[1005][1005]; 

void init(){
	cin>>n>>m>>p;
	for(int i = 0 ; i < n ; i++)
		for(int j = 1 ; j <= m ; j++)scanf("%d" , &gd[j][i]);
	for(int i = 0 ; i < n ; i++)scanf("%d" , &cost[i]);
	memset(f , -0x7f , sizeof(f));
	f[0] = 0;
	memset(sum , 0 , sizeof(sum));
	for(int i = 1 ; i <= m ; i++){
		for(int j = 0 ; j < n ; j++){
			sum[i][j] = sum[i-1][(j - 1 + 3 * n) % n] + gd[i][j];
		}
	}
}

void solve(){
	for(int i = 1 ; i <= m ; i++){
		for(int j = 0 ; j < n ; j++){
			for(int k = 0 ; k < min(i , p) ; k++){
			f[i] = max(f[i] , f[i - k - 1] + sum[i][j] - sum[i - k - 1][(j - k - 1 + 3 * n) % n] - cost[(j - k + 3 * n) % n]);
			}
		}
		for(int j = 0 ; j < n ; j++)jl[i][j] = f[i] - sum[i][j] - cost[j];
	}
	cout<<f[m]<<endl;
}

int main(){
	init();
	solve();
}


发布了80 篇原创文章 · 获赞 3 · 访问量 1758

猜你喜欢

转载自blog.csdn.net/qq_41567618/article/details/104589899