月度归档:2009年09月

迎春舞会之集体舞

【问题描述】
背景 Background
  HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。
【描述 Description 】
  表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下)。而就每个人,他有可能正面朝前(小的向前正三角形)、或向后三角形(小的向后正三角形)。
  然而这些人在服装上有明显区别——一部分穿冬季校服,其他的穿夏季校服。
  现在给出每个人的着衣情况,请你求穿夏季校服的同学所构成的最大正三角形,输出所含人数。

输入格式 Input Format
  第一排为n。
  接下来n排,第i排有2*i-1个有效字符(‘#’或‘-’,分别表示此同学穿冬季校服或穿夏季校服)。输入文件中出现空格,且空格只是为了保持整个三角形的形状。

【输出格式 Output Format】
  输出人数。

【样例输入 Sample Input】
5
#-##—-#
—–#-
—#-
-#-
-

样例输出 Sample Output
9

注释 Hint
n<=100 【算法分析】 对于三角形有两种情况: 尖向下时: f1[i][j]+=min(f1[i-1][j-1],f1[i-1][j],f1[i-1][j+1]) 尖向上时: f2[i][j]+=min(f2[i+1][j-1],f2[i+1][j],f2[i+1][j-1]) 而且一定要仔细看题目给的三角形   “他有可能正面朝前(小的向前正三角形)、或向后三角形(小的向后正三角形)” 注意几点: 1.尖向上的情况,只能是一行中的偶数个 2.尖向下的情况,只能是一行中的奇数个 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <string.h>
 
#define min(a,b) a<b?a:b
 
int main()
{
       char ch[300][300];
       int f[300][300];
       int n, i, j, k, flag, max = 1, len;
 
       scanf("%d", &n);
       getchar();
 
       for (i = 0; i < n; i++)
       {
              gets(ch[i]);
       }
 
       memset(f, 0, sizeof(f));
       j = 0;
 
       while (ch[0][j] == ' ')
              j++;
 
       k = 1;
 
       while (j < strlen(ch[0]))
       {
              if (ch[0][j] == '#')
                     f[0][k++] = 0;
              else if (ch[0][j] == '-')
                     f[0][k++] = 1;
              j++;
       }
       for (i = 1; i < n; i++)
       {
              j = 0;
              while (ch[i][j] == ' ')
                     j++;
 
              k = i;
              flag = 0;
 
              while (ch[i][j] != '\0')
              {
                     if (ch[i][j] != ' ')
                     {
                            flag++;
                            k++;
 
                            if (ch[i][j] == '-')
                            {
                                   f[i][k] = 1;
                                   if (flag % 2 == 1)  //向下的三角形
                                   {
                                          if (f[i - 1][k] != 0 && f[i - 1][k - 1] != 0 && f[i - 1][k + 1] != 0)
                                          {
                                                 f[i][k] += min(f[i - 1][k - 1], f[i - 1][k + 1]);
                                          }
                                   }
                                   else  //向上的三角形
                                   {
                                          if (f[i][k - 1] != 0 && f[i][k - 2] != 0 && f[i - 1][k - 1] != 0)
                                          {
                                                 f[i][k] += min(f[i][k - 2], f[i - 1][k - 1]);
                                          }                                 
                                   }
 
                                   if (f[i][k] > max)
                                          max = f[i][k];
                            }
                     }
                     j++;
              }
       }
 
       printf("%d\n", max * (max * 2 -1 + 1) / 2);
       return 0;
}

HTML中ID和NAME属性的相同点和不同点

某次某日被某人问了一个问题:id和name有哪些相同点,又有哪些不同点?当时只记得id唯一,name可以重复,name可以被用来在表单提交时将字段传给服务器而id不行。
惭愧,从做WEB开发开始,这两个东东就陪伴着我,而我到现在还不知道二都到底有哪些共同点和哪些不同。
惭愧惭愧,应该反省,切记切记:知其然,知其所以然!

【概述】
一般来说,ID是唯一的,可以使用document.getElementByID(id)来获取,而name不一定是唯一的,可能使用document.getElementsByName(name)来获取有相同名字的控件数组。
当一个页面中存在相同ID的时候,如果使用document.getElementByID(id)来获取对象,此时会获取第一个ID为id的控件。
另外ID是区分大小写的,而name相对来说没有这样的限制。
name原来是为了标识之用,但是现在根据规范,都建议用id来标识元素。

【id和name都可以使用】
1、使用链接建立锚点;
使用链接建立锚点时,id和name的效果一样(FF下)即:

1
2
3
<a id="c4">c4</a>
等于
<a name="c4">c4</a>

【只能使用id】
1、label和form控件的关联
例如常见的checkbox和label的关联:

1
2
<input type="checkbox" name="demo" value="ON" id="demo"/>
<label for="demo">DEMO Lable</label>

for属性指定与label关联的元素的id,不可用name替代。另外id与for属性的值需要一样,一模一样。
2、CSS的ID选择器;

【只能使用name】
1、表单(form)的控件名,浏览器会根据name将表单控件的内容发送给服务器的request。
2、frame和window的名字,用于在其他frame或window指定target。
3、作为对象的标识,如Applet、Object、Embed等元素。比如在Applet对象实例中,我们将使用其Name来引用该对象。
4、某些特定元素的属性,如 attribute和param 。
例如为 Object 定义参数

1
<param name = “appletParameter" value = “value”>

5、单选和复选框的分组,radio在一个组内只能选择一个,此时我们使用name属性来实现这个分组,凡是具有相同name的radio中只能选择一个。

【参考资料】

http://www.blogjava.net/rapin/archive/2008/04/01/190133.html

http://www.blogjava.net/flysky19/articles/86733.html

Ajax总结

在工作中用了Ajax N多次了,也看过一些相关方面的书籍,也算是认识了它,但是一直没有认真总结和整理过相关的东东,失败!
近有闲情,将之总结如下:

【名称】
Ajax是Asynchronous JavaScript and XML(以及 DHTML 等)的缩写。
详情请移步Ajax: A New Approach to Web Applications

【原理】
简单一些,就是通过使用XmlHttpRequest对象向服务器发送异步请求,获取返回的数据,并使用Javascript和DOM操作页面内的元素,从而达到改变页面内容的目的。
其中XmlHttpRequest对象是关键,因为它支持异步请求。XMLHttpRequest是完全用来向服务器发出一个请求的。它所包含的方法和属性如下所示:
方法:
●abort() 导致当前正在请求被取消
●getAllResponseHeaders() 返回一个字符串,包含氖 响应标头的名称和值
●getResponseHeader(name) 返回指定的响应标头的值
●open(method, url, async, username, password) 设置请求的方法和目标URL。请求可以声明为同步的(可选),也可以给需要基于窗口谁的请求而提供用户名和口令(可选)
●send(content) 发起带有指定内容(可选)的请求
●setRequestHeader(name, value) 利用指定的名称和值,设置一个请求标头

属性:
●onreadystatechange 指派在请求的状态发生变化时所使用的事件处理程序
●readyState 一个整数值,指示请求的状态如下:
0—-未初始化
1—-正在加载
2—-已加载
3—-交互
4—–完成
●responseText 在响应里所返回的内容
●responseXML 如果内容是XML,就根据内容而创建XML DOM
●status 从服务器所返回的响应状态码。例如:200表示成功,404表示未找到,参考HTTP规范
●statusText 响应所返回的状态文本消息

对于此对象其它介绍请移步:XMLHttpRequest概述

【所包含的技术】
· 基于XHTML和CSS标准的表示;
· 使用Document Object Model进行动态显示和交互;
· 使用XMLHttpRequest与服务器进行异步通信;
· 使用JavaScript绑定一切;
· 使用XML和XSLT;交换和操作数据。
以上的技术都是一些广泛使用了的技术,都属于比较旧的技术,ajax是这几种技术的结合体。

【简单实例】

 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript">
            function ajax() {
                var xmlHttp;
				//	 依据对象判断,而不是依据浏览器
                if(window.XMLHttpRequest)                {
                    xmlHttp=new XMLHttpRequest();//mozilla浏览器
                }else if(window.ActiveXObject){
                    try{
                        xmlHttp=new ActiveXObject("Msxmlx2.XMLHTTP");   //IE老版本
                    }catch(e){}
                    try{
                        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); //IE新版本
                    }catch(e){}
 
                    if(!xmlHttp){
                        window.alert("不能创建XMLHttpRequest对象实列");
                        return false;
                    }
                }
 
                if (!xmlHttp) {
                    alert("创建XMLHttpRequest对象失败!");
                    return false;
                }
 
                xmlHttp.open('POST', 'index.php?get_a=2&get_b=3', false);
     xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=UTF-8;');
                xmlHttp.send("post_a=1&post_b=2");
                xmlHttp.onreadystatechange = function() {
                    alert(xmlHttp.readyState);
                }
                if(xmlHttp.readyState == 4){    //判断对象状态
                    var content_obj = document.getElementById("content");
                    content_obj.innerHTML = "正在处理数据...";
                    if(xmlHttp.status == 200){  //信息已经成功返回,开始处理信息
                        var returnStr = xmlHttp.responseText;
                        content_obj.innerHTML =  returnStr;
                    }else{  //页面不正常
                        content_obj.innerHTML = "您所请求的页面存在异常!";
                    }
                }
            }
 
 
        </script>
    </head>
    <body>
        <input type="button" value="ajax" onclick="ajax();" />
        <div id="content">ajax内容显示区</div>
    </body>
</html>

切记:当发起一个POST请求时,需要对报头 Content-type(内容类型)进行设置。这样,服务器就知道如何来处理上传的内容。如果要模拟通过HTTP协议的POST方式来发送表单,则应将内容类型设置为application/x-www-form-urlencoded。

【优点】

●页面无刷新,用户体验好;
●异步,不打断用户操作,响应速度快;
●“按需取数据”,减少冗余请求,减轻服务器负担;
●基于标准化的并被广泛支持的技术,无需额外的插件;
●可以使数据和表现分离;

【存在的问题】
●一些设备还不支持
●开发成本提高
●使back按钮失效,用户操作后无法返回;
●对流媒体支持没有flash之流好;
●对搜索引擎不友好
●破坏程序的异常机制
●存在一些安全问题,暴露了一些程序接口和数据逻辑