杭电1466------简单的dp
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1466
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int n; int r; //假设有r条非相互平行的线。 int dp[21][191]; memset(dp, 0, sizeof(dp)); for(int i=0; i<=20; i++) { dp[i][0] = 1; for(r=0; r<=i; r++) { for(int j=0; j<=190; j++) { if(dp[r][j]==1) dp[i][(i-r)*r+j] = 1; } } } while(scanf("%d", &n)!=EOF) { for(int j=0; j<=n*(n-1)/2; j++) { if(dp[n][j]==1) { if(j!=0) cout<<" "; cout<<j; } } cout<<endl; } return 0; }
状态转移方程:
m条直线的交点方案数
=(m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案
=(m-r)*r+r条之间本身的交点方案数(0<=r<m)
(百度: 刘春英课件(1) 有详解)。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步