uva 10827 Maximum sum on a torus

来源:互联网 发布:javascript创建表格 编辑:程序博客网 时间:2024/04/28 14:56

题意:此题是uva 108 Maximum Sum的升级版,原本只是求矩阵内的最大和,现在这个矩阵可以构成一个环。


思路:枚举矩阵的宽度,从i到j,然后将矩阵转化为一维,接下来就是如何在一个环上求最大连续和了。


#include <iostream> #include <climits>using namespace std;int n;int a[100][100];int b[100];int dp[100];void input(){cin>>n;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){cin>>a[i][j];}}}int solve(){int maximum = INT_MIN;for(int i = 0; i < n; i++){//枚举宽度,从第i列到第j列 for(int j = 0; j < n; j++){if(i == j+1)continue;for(int l = 0; l < n; l++){//化成一维 b[l] = 0;for(int k = i; k != j+1; k++){if(k >= n)k %= n;b[l] += a[l][k];}dp[l] = b[l];}for(int l = 0; l < n; l++){//枚举dp起点 int cnt = 0;for(int k = l+1; cnt < n-1; k++,cnt++){if(k >= n)k %= n;if(k == 0){if(dp[n-1]+b[0]>dp[0])dp[0] = dp[n-1]+b[0];}else{if(dp[k-1]+b[k]>dp[k])dp[k] = dp[k-1]+b[k];}}for(int k = 0; k < n; k++){if(dp[k] > maximum)maximum = dp[k];dp[k] = b[k];}}}}return maximum;}int main(){int t;cin>>t;for(int i = 0; i < t; i++){input();cout<<solve()<<"\n";}return 0;}


0 0
原创粉丝点击