第一次发博客,纪念今天学会的区间dp 题目链接:点击打开链接 #include <iostream> #include <cstring> #include<vector> #include<algorithm> #include<cmath> using namespace std; int n; int a[102]; int dp[102][102]; //状态方程如下: //dp[i][j]=dp[i+1][j]; //dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]); //这是用区间dp做的 void work(){ for(int len=2;len<=n;len++){ for(int j=n;j>=len;j--){ int k=j-len+1; dp[k][j]=dp[k+1][j]+1; // cout<<k+1<<" "<<j<<" "<<dp[k+1][j]<<" "; for(int x=k+1;x<=j;x++){ if(a[x]==a[k]){ dp[k][j]=min(dp[k][j],dp[k+1][x-1]+dp[x][j]); } } cout<<k<<" "<<j<<" "<<dp[k][j]<<endl; } } cout<<dp[1][n]<<endl int="" dfs="" int="" x="" int="" y="" if="" x="">y) return 0; if(!dp[x][y]){ dp[x][y]=dfs(x+1,y)+1; for(int i=x+1;i<=y;i++){ if(a[i]==a[x]){ dp[x][y]=min(dp[x][y],dfs(x+1,i-1)+dfs(i,y)); } } } return dp[x][y]; } void init(){ cin>>n; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { dp[i][i]=1; } for(int i=1;i<=n;i++){ cin>>a[i]; } cout<<dfs(1,n)<<endl int="" main="" int="" t="" k="0;" cin="">>T; while(T--) { k++; init(); // cout<<"Case "<<k<<": "<<work()<<endl; cout<<"Case "<<k<<": "<<dfs(1,n)<<endl; } return 0; } </endl></endl></cmath></algorithm></vector></cstring></iostream>