【动态规划】Vijos P1218 数字游戏(NOIP2003普及组)
题目链接:
题目大意:
一个N个数的环,分成M块,块内的数求和%10,最后每块地值累乘,求最大和最小。
n(1≤n≤50)和m(1≤m≤9)太小了可以随便搞。
题目思路:
【动态规划】
区间DP。环形DP。断环为链,在后面补一段N,当链做。
f[i][j]表示前I个数分成M块的最大值,g[i][j]为最小值。需要枚举从哪个点L开始向后取N位。
再枚举当前这一块的开头位置K。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<map> 9 #include<memory.h> 10 #include<time.h> 11 #include<stdio.h> 12 #include<stdlib.h> 13 #include<string.h> 14 //#include<stdbool.h> 15 #include<math.h> 16 #define min(a,b) ((a)<(b)?(a):(b)) 17 #define max(a,b) ((a)>(b)?(a):(b)) 18 #define abs(a) ((a)>0?(a):(-(a))) 19 #define lowbit(a) (a&(-a)) 20 #define sqr(a) ((a)*(a)) 21 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 22 #define mem(a,b) memset(a,b,sizeof(a)) 23 #define eps (1e-8) 24 #define J 10 25 #define mod 1000000007 26 #define MAX 0x7f7f7f7f 27 #define PI 3.14159265358979323 28 #define N 104 29 using namespace std; 30 typedef long long LL; 31 int cas,cass; 32 int n,m,lll,ans; 33 int a[N],sum[N]; 34 int f[N][14],g[N][14]; 35 int main() 36 { 37 #ifndef ONLINE_JUDGE 38 freopen("1.txt","r",stdin); 39 // freopen("2.txt","w",stdout); 40 #endif 41 int i,j,k,l,maxx,minn; 42 // for(scanf("%d",&cas);cas;cas--) 43 // for(scanf("%d",&cas),cass=1;cass<=cas;cass++) 44 // while(~scanf("%s",s+1)) 45 while(~scanf("%d",&n)) 46 { 47 maxx=0;minn=MAX; 48 scanf("%d",&m); 49 sum[0]=0; 50 for(i=1;i<=n;i++) 51 { 52 scanf("%d",&a[i]); 53 a[i+n]=a[i]; 54 } 55 for(i=1;i<=n+n;i++) 56 sum[i]=sum[i-1]+a[i]; 57 for(l=0;l<n;l++) 58 { 59 mem(f,0);mem(g,14); 60 for(i=1;i<=n;i++) 61 { 62 f[i+l][1]=((sum[i+l]-sum[l])%10+10)%10; 63 g[i+l][1]=((sum[i+l]-sum[l])%10+10)%10; 64 for(j=2;j<=min(i,m);j++) 65 { 66 for(k=j-1;k<i;k++) 67 { 68 f[i+l][j]=max(f[i+l][j],f[k+l][j-1]*(((sum[i+l]-sum[k+l])%10+10)%10)); 69 g[i+l][j]=min(g[i+l][j],g[k+l][j-1]*(((sum[i+l]-sum[k+l])%10+10)%10)); 70 } 71 } 72 } 73 maxx=max(f[n+l][m],maxx); 74 minn=min(g[n+l][m],minn); 75 } 76 printf("%d\n%d\n",minn,maxx); 77 } 78 return 0; 79 } 80 /* 81 // 82 83 // 84 */