我是被这题彻底折腾惨了 。。
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 }