划分型循环DP

来源:互联网 发布:电力牵引预算编制软件 编辑:程序博客网 时间:2024/06/06 04:01

 题目链接:http://codevs.cn/problem/1085/

分析:求各个区间值,枚举起点,填充基位DP,划分DP处理

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define mod(a,b) ((a%b+b)%b)#define maxn 505#define REP(a,b,c) for(int a = b ; a <= c ; ++a)int n , m;int a[maxn];int sum[maxn];int dp1[maxn][maxn];int dp2[maxn][maxn];int main(){    cin >> n >> m;    REP(i,1,n)scanf("%d",&a[i]),a[i+n] = a[i];    REP(i,1,n<<1)sum[i] = mod(sum[i-1] + a[i] , 10);    int minn = 1e9;    int maxx = 0;    REP(i,0,n-1)//枚举起点    {       memset(dp1,0,sizeof(dp1));       memset(dp2,1,sizeof(dp2));       REP(j,1,n)        dp1[1][j]=dp2[1][j]=mod(sum[j+i]-sum[i],10);       REP(j,2,m)       {           REP(k,j,n)           {               REP(l,1,k-1)               {                   dp1[j][k]=max(dp1[j][k],dp1[j-1][l]*mod(sum[k+i]-sum[l+i],10));                   dp2[j][k]=min(dp2[j][k],dp2[j-1][l]*mod(sum[k+i]-sum[l+i],10));               }           }       }       maxx = max(dp1[m][n],maxx);       minn = min(dp2[m][n],minn);    }    cout << minn << endl << maxx << endl;}


0 0
原创粉丝点击