VJP1063 迎春舞会之集体舞(DP)

我是被这题彻底折腾惨了 。。

DP很简单 不用说了 重点是必须按它那个图说来来划分三角形 而不是随便撇下一部分 随便划下一个三角形就可以

所以 要判断J是第奇数个点才可以

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 int dp1[210][210],sum[210],dp2[210][210];
 8 char s[210][210];
 9 int main()
10 {
11     int i,j,n;
12     cin>>n;
13     for(i = 1; i <= n ;i++)
14         cin>>s[i];
15     for(i = 1; i <= n ;i++)
16         for(j = 0 ; j < 2*(n-i+1)-1 ; j++)
17             if(s[i][j]=='-')
18             {
19                 dp1[i][j] = 1;
20                 dp2[i][j] = 1;
21             }
22     for(i = 2; i <= n ;i++)
23     {
24         for(j = 0 ; j < 2*(n-i+1)-1 ; j++)
25         {
26             if(s[i][j]=='-'&&s[i-1][j]=='-'&&s[i-1][j+1]=='-'&&s[i-1][j+2]=='-')
27             {
28                 dp1[i][j] = min(dp1[i-1][j],min(dp1[i-1][j+1],dp1[i-1][j+2]))+1;
29             }
30         }
31     }
32     for(i = n-2 ; i>= 1; i--)
33     {
34         for(j = 2 ; j < 2*(n-i+1)-3 ; j++)
35 
36             if(s[i][j]=='-'&&s[i+1][j-2]=='-'&&s[i+1][j-1]=='-'&&s[i+1][j]=='-')
37             dp2[i][j] = min(dp2[i+1][j],min(dp2[i+1][j-1],dp2[i+1][j-2]))+1;
38 
39     }
40     int ans =0;
41     for(i= 1; i <= n ; i++)
42         for(j = 0 ; j < 2*(n-i+1)-1;  j++)
43         {
44             if(j%2==0)
45             ans = max(max(dp1[i][j],dp2[i][j]),ans);
46         }
47     sum[1] = 1;
48     int re=1;
49     for(i = 2 ; i <= ans ;i++)
50     {
51         sum[i] = sum[i-1]+2;
52         re+=sum[i];
53     }
54     if(ans)
55     cout<<re<<endl;
56     else
57     cout<<"0
";
58     return 0;
59 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3278792.html