(HDOJ-1466计算直线的交点数)
发现:m条直线的交点方案数
=(m-r)条平行线与r条直线交叉的交点数+r条直线本身的交点方案
=(m-r)*r+r条直线本身的交点方案数(0<=r<m)
D:/我的课件/ACM/动态规划lcy(lecture_04)/动态规划(1)_20080317.ppt 2009/7/16
算法总体思想
动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经过分解得到的子问题往往不是相互独立的。不同子问题的数目常常只有多项式量级。在分治法求解时,有些子问题被重复计算了多次。
如果能够保存已解决的子问题的答案,而在需要时再找出已求的得的答案,就可以避免大量重复计算,从而得到多项式时间算法。2009/7/16
数塔问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1163
#include <iostream>
using namespace std;
int main()
{ int n,a[100][100];
while(cin>>n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(i=n-1;i>0;i--)
for(int j=1;j<=i;j++) if(a[i+1][j]>a[i+1][j+1])a[i][j]+=a[i+1][j];
else a[i][j]+=a[i+1][j+1];
cout<<a[1][1]<<endl;
}
return 0;
}
1:虽然定义的是矩形式的二维数组,但用它来处理(存放)数塔式的数据是可行的,这里用了语句for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>a[i][j];
(浪费了空间)只在“对应位置”存放对应数据,起到了很好的作用;
2:语句:
for(i=n-1;i>0;i--)
for(j=1;j<i;j++)
if(a[i+1][j]>a[i+1][j+1])
a[i][j]+=a[i+1][j];
else
a[i][j]+=a[i+1][j+1];
这里存储式的方法是处理动态规划的好方法