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\n";

58     return 0;

59 }
View Code

 

你可能感兴趣的:(dp)