专栏文章

题解:P4813 [CCO 2014] Troy 与三角形

P4813题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@min7o18x
此快照首次捕获于
2025/12/01 21:54
3 个月前
此快照最后确认于
2025/12/01 21:54
3 个月前
查看原文

题解:P4813 [CCO 2014] Troy 与三角形

题目传送门

虽是一道绿题,但码量只有一道橙题。
题目让求#号三角形的数量,考虑 dp,其中 dpi,jdp_{i,j} 表示第 ii 行第 jj 列为右下角出现#号三角形的个数。
很显然,每一个点的#号三角形的个数其实是和它在右下角最大形成的#号三角形高度相等。而每个点在右下角最大形成的#号三角形高度只收到如图中两个因素的影响:

显然 dpi,j=min(x,y+12)dp_{i,j}=\min(x,\dfrac{y+1}{2}),而 x=dpi1,j1+1x=dp_{i-1,j-1}+1。所以 dpi,j=min(dpi1,j1+1,y+12)dp_{i,j}=\min(dp_{i-1,j-1}+1,\dfrac{y+1}{2})

代码:

CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
char c[2005][2005];int cnt,ans,n,dp[2005][2005];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>c[i][j];//输入
	for(int i=1;i<=n;i++){
		cnt=0;for(int j=1;j<=n;j++){
			if(c[i][j]=='#'){
				cnt++;//cnt对应题目中的y
dp[i][j]=min(dp[i-1][j-1]+1,(cnt+1)/2);//dp转移
				ans+=dp[i][j];
			}
			else cnt=0;
		}
	}
	cout<<ans;
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...