zju 1234 Chopsticks (DP)
2011-08-17 18:34
246 查看
题解慢慢补充:
法一:
顺序Dp
法二:
逆序DP。
其中空间还可以优化。
法一:
顺序Dp
#include<iostream> #include<cstring> using namespace std; #define MAX_N 5001 #define Min(a,b) (a)<(b)?(a):(b) int dp[2][MAX_N],Dischop[MAX_N],T,K,N; int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); cin>>T; while(T--){ cin>>K>>N; K+=8; int i=1,j; while(i<=N) cin>>Dischop[i++]; memset(dp,0,sizeof(dp)); for(i=1;i<=K;i++){ j=i<<1; dp[1][j]=dp[0][j-2]+(Dischop[j]-Dischop[j-1])*(Dischop[j]-Dischop[j-1]); j++; while(j<N-3*(K-i)){ dp[1][j]=dp[0][j-2]+(Dischop[j]-Dischop[j-1])*(Dischop[j]-Dischop[j-1]); dp[1][j]=Min(dp[1][j],dp[1][j-1]); j++; } dp[1][j]=dp[1][j-1]; memcpy(dp[0],dp[1],sizeof(dp[0])); } cout<<dp[1] <<endl; } return 0; }
法二:
逆序DP。
其中空间还可以优化。
#include<stdio.h> #define MAX_N 5001 long chop[MAX_N],dp[MAX_N][MAX_N/5]; int main(){ int T,N,K,i,j; scanf("%d",&T); while(T--){ scanf("%d %d",&K,&N); K+=8; int t=0,s; for(i=1;i<=N;i++){ scanf("%d",&s); chop[i-1]=(s-t)*(s-t); t=s; } for(i=0;i<=N;i++) for(j=0;j<=K;j++) j==0?dp[i][j]=0:dp[i][j]=-1; for(i=N-2;i>=1;i--){ for(j=1;j*3<=(N-i+1);j++){ dp[i][j]=dp[i+1][j]; if(dp[i+2][j-1] >= 0 && (dp[i+2][j-1]+chop[i] < dp[i][j] ||dp[i][j] == -1) ) dp[i][j]=dp[i+2][j-1]+chop[i]; } } printf("%ld\n",dp[1][K]); } return 0; }
相关文章推荐
- [动态规划]Zju1234--Chopsticks
- ZJU1234 Chopsticks - 动态规划
- zoj1234 chopsticks 经典dp
- ZJU 1234 Chopsticks
- UVA-10271 Chopsticks (线性DP)
- uva 10271 Chopsticks(dp)
- uva_10271 - Chopsticks (普通DP)
- uva 10271 Chopsticks(dp)
- HDU 3709 ZJU 3416 Balanced Number 数位dp 记忆搜索
- uva 10271 Chopsticks (DP)
- UVA 10271 Chopsticks(dp)
- 三塔DP——http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3554
- [dp] uva10271 Chopsticks
- UVA 题目10271 - Chopsticks(DP)
- (树形DP)tree of tree (zju)
- (ZJU-2005复试)-HDOJ-1234-开门人和关门人
- !HDU 1500 Chopsticks-dp-(分组问题)
- ZOJ 1234 UVA 10271 Chopsticks
- hdu 1500 Chopsticks (dp)
- bzoj 1902: Zju2116 Christopher lucas定理 && 数位DP