转载请注明出处:http://blog.csdn.net/a1dark
分析:这题很像数塔那种动态规划、边界要特殊处理一下、但是只是这样是不行的、由于每一层可以循环、所以不满足动态规划的无后效行、于是你需要多次遍历、直到没有变化为止、其实这题还可以用最短路来做、只要把图建好、一个模板最短路就OK了、
#include<stdio.h> #include<algorithm> using namespace std; int n; int num[1005][1005]; int dp[1005][1005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) scanf("%d",&num[i][j]); } for(int i=0;i<=1004;i++) { for(int j=0;j<=1004;j++) { dp[i][j]=0x7ffffff; } } dp[n][1]=num[n][1]; for(int i=n;i>=1;i--) { int temp=10; while(temp--) for(int j=1;j<=i;j++) { if(j==1) { dp[i][j]=min(dp[i][j],dp[i+1][j]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i+1][j+1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i][j+1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i][i]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i+1][i+1]+num[i][j]); } else if(j==i) { dp[i][j]=min(dp[i][j],dp[i+1][j]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i+1][j+1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i][1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i][j-1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i+1][1]+num[i][j]); } else { dp[i][j]=min(dp[i][j],dp[i+1][j]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i+1][j+1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i][j+1]+num[i][j]); dp[i][j]=min(dp[i][j],dp[i][j-1]+num[i][j]); } } } printf("%d\n",dp[1][1]); return 0; }