正文

Zju 1245 Triangles2006-10-20 23:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/19548.html

分享到:

2111683 2006-10-20 22:42:27 Accepted 1245 C++ 00:00.12 1004K Crux.D     1245是一道比较经典的dp。一个大的正三角形,由许多小的三角形组成,他们分为黑白二色。求最大的白色正三角形面积。     思路不难。把每一行白色的累计数存起来作dp。当然这要分尖朝上的和尖朝下的。朝上的公式是r[i][k] = min(r[i - 1][k - 1] + 1, b[i][k]); b存的是白色的累计数,r是最终的边长。朝下的亦同。     似乎很简单。可好久没做题了,犯了些低级失误,比如把b和r写反了。我不知道这和越来越近的考研有什么关系——也许我就是在岩壁上紧抓藤蔓的失足者,寒冷的1月就是悬崖下的毒蛇。     所以......还是要加油了。藤蔓不是这么可靠的,我的数学也一样。     附程序,写的比较烂,仅供参考。 #include <iostream>#include <cstring>using namespace std; int n, b[101][210], r[101][210], ans; int min(int a, int b){ return a < b ? a : b;} int main(){ //freopen("in.txt", "r", stdin); int i, k, c = 1; while(cin >> n && n) {   memset(b, 0, sizeof(b));  memset(r, 0, sizeof(r));  printf("Triangle #%d\n", c ++);  for(i = 1; i <= n; i ++)  {   int t = 0;   for(k = i; k <= 2 * n - i; k ++)   {    char ch;    cin >> ch;    if(ch == '#')     t = 0;    else     t ++;    b[i][k] = (t + 1) / 2;   }  }  ans = 0;  for(i = 1; i <= n; i ++)  {   for(k = i; k <= 2 * n - i; k ++)   {    if((i + k) % 2 == 1)    {     r[i][k] = min(r[i - 1][k - 1] + 1, b[i][k]);     if(ans < r[i][k])      ans = r[i][k];    }   }  }  for(i = n; i >= 1; i --)  {   for(k = i; k <= 2 * n - i; k ++)   {    if((i + k) % 2 == 0)    {     r[i][k] = min(r[i + 1][k - 1] + 1, b[i][k]);     if(ans < r[i][k])      ans = r[i][k];    }   }  }  //pb();  //pr();  printf("The largest triangle area is %d.\n\n", ans * ans); } return 0;}        

阅读(3450) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册