CF-295D-Greg and Caves(dp+思维)

题意:http://codeforces.com/problemset/problem/295/D

思路:

可以把图形看成上下两个金字塔(极端情况下长方形),dp出以i的长为底,以j为高的三角形数(长方形),再预处理前缀(以i的长为底,以<=j为高),然后就枚举中心行,上下金字塔数相乘,注意两个图形的底边相同导致重复的可能性

  1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
  2 #include <cstdio>//sprintf islower isupper
  3 #include <cstdlib>//malloc  exit strcat itoa system("cls")
  4 #include <iostream>//pair
  5 #include <fstream>//freopen("C:\Users\13606\Desktop\Input.txt","r",stdin);
  6 #include <bitset>
  7 //#include <map>
  8 //#include<unordered_map>
  9 #include <vector>
 10 #include <stack>
 11 #include <set>
 12 #include <string.h>//strstr substr strcat
 13 #include <string>
 14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
 15 #include <cmath>
 16 #include <deque>
 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
 18 #include <vector>//emplace_back
 19 //#include <math.h>
 20 #include <cassert>
 21 #include <iomanip>
 22 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
 23 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
 24 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
 25 //******************
 26 clock_t __START,__END;
 27 double __TOTALTIME;
 28 void _MS(){__START=clock();}
 29 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__START)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
 30 //***********************
 31 #define rint register int
 32 #define fo(a,b,c) for(rint a=b;a<=c;++a)
 33 #define fr(a,b,c) for(rint a=b;a>=c;--a)
 34 #define mem(a,b) memset(a,b,sizeof(a))
 35 #define pr printf
 36 #define sc scanf
 37 #define ls rt<<1
 38 #define rs rt<<1|1
 39 typedef pair<int,int> PII;
 40 typedef vector<int> VI;
 41 typedef unsigned long long ull;
 42 typedef long long ll;
 43 typedef double db;
 44 const db E=2.718281828;
 45 const db PI=acos(-1.0);
 46 const ll INF=(1LL<<60);
 47 const int inf=(1<<30);
 48 const db ESP=1e-9;
 49 const int mod=(int)1e9+7;
 50 const int N=(int)2e3+10;
 51 
 52 ll sq[N][N];
 53 ll sum[N];
 54 
 55 int main()
 56 {
 57     int n,m;
 58     sc("%d%d",&n,&m);
 59     if(m<2)
 60     {
 61         pr("0
");
 62         return 0;
 63     }
 64     for(int i=2;i<=m;++i)
 65         sq[i][1]=1;
 66     for(int i=2;i<=n;++i)
 67     {
 68         sq[2][i]=1;
 69         sum[2]=1;
 70         for(int j=3;j<=m;++j)
 71             sum[j]=sq[j][i-1]+sum[j-1],sum[j]%=mod;
 72         ll temp=1;
 73         for(int j=3;j<=m;++j)
 74             temp+=sum[j],temp%=mod,sq[j][i]=temp;
 75     }
 76 //    for(int i=1;i<=n;++i)
 77 //        for(int j=2;j<=m;++j)
 78 //        {
 79 //            pr("%d %d: %lld
",j,i,sq[j][i]);
 80 //        }
 81     for(int j=2;j<=m;++j)
 82         for(int i=2;i<=n;++i)
 83         {
 84             sq[j][i]+=sq[j][i-1];
 85             sq[j][i]%=mod;
 86         }
 87     ll ans=0;
 88 //    for(int i=2;i<=m;++i)sq[i][0]=1;
 89     for(int i=1;i<=n;++i)
 90     {
 91         for(int j=2;j<=m;++j)sum[j]=sq[j][n-i];
 92         for(int j=3;j<=m;++j)sum[j]+=sum[j-1],sum[j]%=mod;
 93         ans+=sq[2][i]*(m-2+1)%mod;
 94         ans%=mod;
 95         ll temp=0;
 96         for(int j=3;j<=m;++j)
 97             ans+=sq[j][i]*(m-j+1)%mod,ans%=mod;
 98         for(int j=3;j<=m;++j)
 99         {
100             temp+=sum[j-1];
101             temp%=mod;
102             temp+=sq[j-1][n-i];
103             temp%=mod;
104             ans+=sq[j][i]*temp%mod*(m-j+1)%mod;
105             ans%=mod;
106         //    temp+=sum[j];
107         }
108     }
109     pr("%lld
",ans);
110     return 0;
111 }
112 
113 /**************************************************************************************/
原文地址:https://www.cnblogs.com/--HPY-7m/p/12594093.html