不排序直接重复dp n^2次为什么过了
查看原帖
不排序直接重复dp n^2次为什么过了
422684
M1saka16I72楼主2023/12/6 12:43

有大佬能给个正确性证明吗,乱搞做法竟然过了我也很蒙。。。

#include <bits/stdc++.h>
#define pii pair<int,int>
#define mp_ make_pair
#define fst first
#define snd second
#define debug cout<<"\n*******\n";
const int INF = 0x3f3f3f3f;
using namespace std;
int sq[35][3];
int ans[35][3];
inline pii getP(int a){
	pii ans;
	if(a==0)	ans = mp_(1,2);
	else if(a==1)	ans = mp_(0,2);
	else	ans = mp_(0,1);
	return ans;
}
int main(){
	int n,cnt = 1;
	while(cin>>n && n){
		sq[0][0] = INF;sq[0][1] = INF;sq[0][2] = INF;
		for(int i=1;i<=n;i++)	cin>>sq[i][0]>>sq[i][1]>>sq[i][2];
		memset(ans,0,sizeof(ans));
		for(int i=1;i<=n;i++){
			for(int j=0;j<=2;j++){
				ans[i][j] = sq[i][j];
			}
		}
		for(int j=1;j<=n*n;j++){
			for(int sa=1;sa<=n;sa++){
				for(int pi=0;pi<=2;pi++){
					for(int sb=1;sb<=n;sb++){
						for(int pj=0;pj<=2;pj++){
							int a_p1 = getP(pi).fst;int a_p2 = getP(pi).snd;
							int b_p1 = getP(pj).fst;int b_p2 = getP(pj).snd;
							if(sq[sa][a_p1]<sq[sb][b_p1] && sq[sa][a_p2]<sq[sb][b_p2] || sq[sa][a_p2]<sq[sb][b_p1] && sq[sa][a_p1]<sq[sb][b_p2]){
								//在sa以pi号边为高,sb以pj号边为高时,正方体sa可以叠在sb上 
								ans[sa][pi] = max(ans[sa][pi],ans[sb][pj]+sq[sa][pi]);
							}
//							cout << sa << " " << pi << " " << sb << " " << pj << " " << ans[sa][pi] << "\n";
						}
					}
				}
			}
		}
		int maxans = 0;
		for(int i=1;i<=n;i++){
			for(int j=0;j<=2;j++){
				maxans = max(maxans,ans[i][j]);
			}
		}
		cout << "Case " << cnt << ": maximum height = " << maxans << "\n";
		cnt++;
	}
} 
2023/12/6 12:43
加载中...